amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > parallelport mit gcc [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

22.11.2004, 00:23 Uhr

Bernhard
Posts: 144
Nutzer
Hallo!

Ich habe ein kleines Problem. Und zwar möchte ich am Paralleport vom Amiga ein paar Pins ein und ausschalten, nur weiß ich nicht so recht, wie ich die ansteuern kann. hab mal ein kleines programm geschrieben, nur irgendwas ist da falsch und der Amiga stürtzt ab.

Das Programm:

#include<stdio.h>
#include<stdlib.h>

#define BASEPORT *(int*)0xBFE101
#define PORTINIT *(int*)0xBFE301

main(int argc, char *argv[])
{
int a;
if(argc!=2){perror("argc");exit(1);}
PORTINIT=0xFF;
a=atoi(argv[1]);
BASEPORT=a;
}

was läuft da falsch und wie kann i des ändern dass es hinhaut.

Danke
Bernhard

[ - Antworten - Zitieren - Direktlink - ]

22.11.2004, 11:18 Uhr

thomas
Posts: 7717
Nutzer
Die CIA-Register sind Bytes, keine Longwords. Wenn du mit int drauf schreibst, nagelst du direkt vier Register auf einmal zu. Noch dazu schreibst du ein Langwort auf eine ungerade Adresse, was beim 68000 definitiv zu einem Absturz führt.

Korrekt wäre

#define CIA_A_PRB *(unsigned char *)0xBFE101
#define CIA_A_DDRB *(unsigned char *)0xBFE301

Naja, und daß du den CIA eigentlich erst reservieren mußt bevor du auf die Register zugreifen darfst, sollte ich hier nicht erwähnen müssen.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ Dieser Beitrag wurde von thomas am 22.11.2004 editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

22.11.2004, 14:36 Uhr

Bernhard
Posts: 144
Nutzer
Hallo!

Danke. hab mir schon sowas gedacht. In dem quellcode wo ich das herhabe, stand es so:

#define BASEPORT *(byte*)0xBFE101

nur der gcc konnte mit "byte" nix anfangen und da hab i des einfach geändert und das war wohl der fehler!

Hab das programm dann so wie ich es abgedruckt hab unter WinUAE kompiliert und testweise laufen lassen und da gabs keine probleme. und dann hab ich es auf meinen A600 rüberkopiert und der ist abgeschmiert. werds dann heut abend gleich ausprobieren.

Und wie geht das mit den adressen reservieren?

Danke
Bernhard

[ - Antworten - Zitieren - Direktlink - ]

22.11.2004, 15:57 Uhr

gni
Posts: 1106
Nutzer
Zitat:
Bernhard:
In dem quellcode wo ich das herhabe, stand es so:

#define BASEPORT *(byte*)0xBFE101

nur der gcc konnte mit "byte" nix anfangen und da hab i des einfach geändert und das war wohl der fehler!

"byte" war vermutlich ein typedef oder #define. Eventuell mußt Du auch noch "volatile" benutzen.
Zitat:
Und wie geht das mit den adressen reservieren?
Nicht Adressen werden reserviert, sondern man sichert sich den (exklusiven) Zugriff auf Resourcen. Hier mußt Du Dich um die entsprechende cia<X>.resource bemühen.

[ - Antworten - Zitieren - Direktlink - ]

22.11.2004, 16:18 Uhr

Bernhard
Posts: 144
Nutzer
gut, also das mit den bytes krieg ich hin.

Wie schauts jetzt mit den ressourcen aus? wo muss ich die wie reservieren. hab da leider ned so viel ahnung davon.

Danke
Bernhard

[ - Antworten - Zitieren - Direktlink - ]

22.11.2004, 16:37 Uhr

thomas
Posts: 7717
Nutzer

Die cia.resource ist nur für die Interrupts. Du brauchst die misc.resource.

Beispiel:
code:
#include <proto/exec.h>
#include <proto/misc.h>
#include <resources/misc.h>

struct Library *MiscBase;

int main (void)

{
if (MiscBase = (struct Library *) OpenResource ("misc.resource"))
	{
	if (!AllocMiscResource (MR_PARALLELPORT,"My Program Name"))
		{

		/* hier darfst du dich austoben */

		FreeMiscResource (MR_PARALLELPORT);
		}
	}
return (0);
}


Übrigens, AllocMiscResource gibt einen Pointer zurück. Wenn er nicht Null ist, zeigt er auf den Namen desjenigen, der die Resource gerade benutzt.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Antworten - Zitieren - Direktlink - ]

22.11.2004, 17:49 Uhr

Gazelle
Posts: 151
Nutzer
Falls Du nicht alles selber machen willst:

Es gibt ein kleines Programm, mittels dem man über ARexx den Parallelport des Amigas steuern kann, zu finden im Aminet:

paarexx.lha util/rexx 19K 432 Arexx Server to control parallel port lines V1.0

Einfach Paarexx starten und dann mittels ARexx die Pins ein- und ausschalten.

Die EMail vom Autor ist sicherlich nicht mehr korrekt, allerdings kenne ich ihn persönlich. Falls Du Kontakt wünschst kann ich als Vermittler dienen.

hth, Bernd

[ - Antworten - Zitieren - Direktlink - ]

23.11.2004, 19:09 Uhr

Bernhard
Posts: 144
Nutzer
Hallo

Bin erst heute zum ausprobieren gekommen.

@thomas:

Danke für den code. nur leider haut der mit dem gcc nicht hin. hab jetzt "struct Node *MiscBase;" gemacht und dann gehts. ich hoff dass das so richtig ist.

@gazelle:
Danke für den tipp mit dem arexx-script, aber ich möchte es selber lernen und es soll auch auf nem A600 ohne arexx laufen und soll zur vorbereitung für was größeres dienen.

danke an alle für die tips!

Bernhard

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > parallelport mit gcc [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.