- Labornetzteil AliExpress         
Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 28 von 28

Thema: Winavr - Direktzuweisung ?

  1. #21
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Anzeige

    Praxistest und DIY Projekte
    Hallo Roberto,
    Du irrst aber durch die C Compiler Welt
    /*Offtopic*/
    Was war denn so schlimm an CodeVison(Es ist keine Ironie sondern eine ernste Frage)
    /*Ende Offtopic*/

    Ja ich weiß, Du möchtest irgendwas haben, was immer wieder aus neue einsetzbar ist, ohne viel in Code rumzuwühlen, kann ich gut nachvollziehen!

    Ich mache es z.B. so
    lcd.h
    Code:
    #define DATADDR DDRA
    #define DATAPORT PORTA
    #define DATAPIN PINA
    #define ENABLEPORT PORTC
    #define ENABLEDDR DDRC
    #define ENABLE (1<<PC6)
    #define RWPORT PORTC
    #define RWDDR DDRC
    #define RW (1<<PC7)
    #define RSPORT PORTG
    #define RSDDR DDRG
    #define RS (1<<PG2)
    dann ein Auszug aus lcd.c
    Code:
    uint8_t get_busy_flag(void) {
    	uint8_t busy;
    	DATADDR = 0;
    	DATAPORT = 0x00;
    	RWPORT |= RW;
    	enable();
    	busy = DATAPIN;
    	RWPORT &= ~RW;
    	DATADDR = 0xFF;
    	if (busy & 0x80) 
    	  return 1; 
    	else 
    	  return 0;
    }
    Du siehst also, wenn ich einen anderen µC nehme, oder das ganze anders belege,
    brauche ich nur ein paar Änderungen in lcd.h machen
    Man kann das auch weiter vereinfachen und zwar liegen die Register PIN* DDR* PORT*
    immer beieinander (leider weiß ich nicht mehr aus dem Kopf in welcher Reihenfolge)
    dann könnte man einfach nur sowas machen
    Code:
    #define DATAPIN PINC
    #define DATADDR DATAPIN+1
    #define DATAPORT DATADDR+1
    jetzt muß man nur noch 1 Zeile Ändern!
    Ich weiß jetzt wirkilch nicht ob die Reihenfolge so stimmt, also nicht drauf verlassen,
    lieber in io*.h nachschauen !

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  2. #22
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.10.2004
    Ort
    GRAZ
    Alter
    58
    Beiträge
    576
    Hallo izaseba

    Was war denn so schlimm an CodeVison(Es ist keine Ironie sondern eine ernste Frage)
    Naja, Codevision weicht leider schon ein bisschen vom Standart-C ab.
    Sie machen da Vereinfachungen rein , die sicher auch sehr vorteilhaft sind, aber sie machen dadurch teilweise eine neue Sprache.
    Z.B. das jetzt mit Porta.1 oder die andere Sache mit dem String
    https://www.roboternetz.de/phpBB2/ze...864&highlight=
    , oder die Interrupts sind ganz anders .....

    Ich will da nicht wieder das ganze Programm umschreiben , wenn ich dann einmal einen anderen Compiler verwende.
    Darum jetzt der Rückschritt auf WInAVR
    Und wenn ich schon das lerne, dann vielleicht gleich so, dass ich es dann auch z.B. beim PC anwenden kann..
    -----
    Also das mit dem Port-Pin zuweisen, ist schon schön umständlich
    Statt rs= 0 muss ich so einen Haufen Zeichen schreiben...

    Aber egal....
    Ich werde es mal so probieren...

    Wenn ich deinen Code richtig interpretiere...
    Könnte ich auch schreiben:

    #define rw (1<<PA6).................(oder halt nur (1<<6)
    #define Adressport PORTA

    Adressport |= rw; (rw auf 1 setzen)
    Adressport &= ~rw; (rw auf 0 setzen)


    sehe ich das so richtig ?

    l.G. Roberto

  3. #23
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Also das mit dem Port-Pin zuweisen, ist schon schön umständlich Eh?
    Statt rs= 0 muss ich so einen Haufen Zeichen schreiben... Eh?
    Ja nun, Du möchtest doch 'standard' C
    Und so viel ist es doch nicht, ich habe meine lcd.h mal geschrieben,
    und gut ist, davon habe ich noch eine für 4Bit Datenbus.
    Es werden nur die ganzen Dateien kopiert, Portzuweisungen geändert,
    und danach wieder vergessen.

    #define rw (1<<PA6).................(oder halt nur (1<<6)
    #define Adressport PORTA

    Adressport |= rw; (rw auf 1 setzen)
    Adressport &= ~rw; (rw auf 0 setzen)


    sehe ich das so richtig ?
    Ich würd mal sagen, das siehst Du richtig, ja

    Gruß Sebastian

    P.S. die Väter von C haben mal empfohlen solche 'Konstanten' Groß zu schreiben, damit man sie besser im Code von den anderen Sachen unterscheiden kann also anstatt Adressport, ADRESSPORT usw.
    Es ist nicht zwingend, macht aber Sinn.
    Das wollte ich nur so nebenbei in den Raum werfen.
    Software is like s e x: its better when its free.
    Linus Torvald

  4. #24
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.10.2004
    Ort
    GRAZ
    Alter
    58
    Beiträge
    576
    Danke .......... \/

  5. #25
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.10.2004
    Ort
    GRAZ
    Alter
    58
    Beiträge
    576
    Hallo (nochmal )

    Muss da nochmal nachfragen

    Habe da im Tutorial noch was gefunden...
    http://www.mikrocontroller.net/artic...R-GCC-Tutorial
    Veraltete Funktionen zum Zugriff auf Bits in Registern

    cbi und sbi zum Löschen und Setzen von Bits sind nicht mehr erforderlich, der Compiler unterstützt dies ohne diesen Umweg. Die Bezeichnung ist ohnehin irreführend da die Funktionen nur für Register mit Adressen im unteren Speicherbereich tatsächlich in die Assembleranweisungen cbi und sbi übersetzt werden.

    // alt:
    sbi(PORTB, PB2);
    cbi(PORTC, PC1);

    // neu (auch nicht mehr wirklich neu...):
    PORTB |= (1<<PB2);
    PORTC &= ~(1<<PC1);

    Will oder kann man den Code nicht portieren, ist zur weiteren Verwendung von sbi und cbi die Header-Datei compat/deprecated.h einzubinden. Wer unbedingt will, kann sich natürlich eigene Makros mit aussagekräftigeren Namen definieren. Zum Beispiel:

    #define SET_BIT(PORT, BITNUM) ((PORT) |= (1<<(BITNUM)))
    #define CLEAR_BIT(PORT, BITNUM) ((PORT) &= ~(1<<(BITNUM)))
    #define TOGGLE_BIT(PORT, BITNUM) ((PORT) ^= (1<<(BITNUM)))
    Kann mir jemand bitte das untere mit Define und mit den Klammern erklären?

    Irgendwie will ich noch nicht so recht wahrhaben, dass ich da mit Define nicht meinen Pin angeben kann
    Geht das vielleicht irgendwie mit SPI ? oder mit (PORT,BITNUM)... ???

    (zur Erinnerung: Möchte sagen: Motorpin = 1;
    (vorher definiert mit Motorpin = PORTA und PIN 2))

    Vielleicht weis ja doch jemand noch ein Lösung?

    Wie macht es den CodeVision?
    Da gibt man ja auch an: PORTA.1= 2
    Könnte man das irgendwie einfach nachbilden ?

    l.G. Roberto

  6. #26
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2007
    Beiträge
    386
    ....warum funktioniert die dirktanweisung( PORTC.2=1 ) dann im wrkit bzw. keil das sind doch auch c-compiler?......


    das sind schlechte compiler, die sich nicht an den standart halten, sondern machen es so, wie gerade die parteifahne weht. kosten zwar geld, verderben aber den charakter.

    mfg

  7. #27
    Benutzer Stammmitglied
    Registriert seit
    24.09.2006
    Beiträge
    84
    Hi, die Sache mit dem Bit setzen kannst du mit Hilfe von Makros lösen. Hier eine Lösung, die gut funktionieren sollte:
    http://www.avrfreaks.net/index.php?n...wtopic&t=37871

    Alles weiterführende wird dann dort erklärt ..

    Grüße CsT

  8. #28
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.10.2004
    Ort
    GRAZ
    Alter
    58
    Beiträge
    576
    Hallo Cst (Danke für die Antwort)

    Habe mir jetzt mal deinen Link angeschaut.
    (Leider kann ich nicht so gut englisch)

    Die Definition mit:
    #define LED0 SBIT( PORTB, 1 )
    Wäre schon toll gewesen, funktioniert aber leider nicht bei mir.
    sci und cbi habe ich jetzt auch mal probiert... Geht leider auch nicht.

    Schade...

    L.G. Roberto

Seite 3 von 3 ErsteErste 123

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress