www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Hardwarefehler finden


Autor: Heike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe an meinen ATmega einen RTL8019AS und ein externes SRAM mit dem 
benötigten Latch angeschlossen.
In das SRAM kann ich schreiben und auslesen.
Meine Hardware ist zweifach vorhanden und einmal funktioniert die 
Hardware -> es ist kein grundsätzlicher Verdrahtungsfehler. Die Software 
funktioniert auch.

Ich habe mit einem Multimeter die Verbindungen vom ATmega zum RTL8019AS 
nachgemessen und erkenne keine Fehler.

Nun wollte ich mit folgendem Testprogramm an jedem zweiten Ausgang zum 
RTL8019AS "5V" rausschicken und diese mit einem Oszi nachmessen:

{...
  PORTA &= ~(_BV(PA1)) | ~(_BV(PA3)) | ~(_BV(PA5)) | ~(_BV(PA7));
  PORTA =  _BV(PA0) | _BV(PA2) | _BV(PA4) | _BV(PA6);
  DDRG = (1<<DDG1);
  PORTG =  _BV(PG1);
  for (;;);
}

Wenn ich die Signale an diesen Pins anschaue, so wechseln sie von 
ständig zwischen 5V und 0V.

Liegt das an meinem Programm, oder kann es an der Hardware liegen. Soll 
ich die externen Pullups ausschalten?

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> PORTA &= ~(_BV(PA1)) | ~(_BV(PA3)) | ~(_BV(PA5)) | ~(_BV(PA7));
Also kein Hardware-Fehler, sondern ein Software-Fehler...

Überlege mal, was die obige Anweisung macht. _BV(PA1) entspricht (1 << 
PA1), also 0b00000010. Dementsprechend ist ~(_BV(PA1)) ~(1 << PA1), also 
0b11111101. Dann hast Du noch ~(_BV(PA3)) usw.. Wenn Du die ganzen 
Bitmasken veroderst, kommt folgendes raus:
~(_BV(PA1))  -> 11111101
~(_BV(PA3))  -> 11110111
~(_BV(PA5))  -> 11011111
~(_BV(PA7))  -> 01111111
                --------
                11111111
Mit anderen Worten: Da steht immer 0b11111111 im Portregister! Wenn Du 
die Bits tatsächlich löschen willst, dann muss es
PORTA &= ~(_BV(PA1) | _BV(PA3) | _BV(PA5) | _BV(PA7));
heißen.

Autor: Rahul, der Trollige (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
de Morgan lässt grüssen...

Autor: Rahul, der Trollige (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Entweder so:
>PORTA &= ~(_BV(PA1) | _BV(PA3) | _BV(PA5) | _BV(PA7));

oder (vermutlich) so:
PORTA |= ~_BV(PA1) &  ~_BV(PA3) & ~_BV(PA5) & ~_BV(PA7));

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Rahul:
Einen wunderschönen guten Morgen! Also auf ein neues... Hast Du die 
Voodoo-Puppe schon griffbereit;-?

Autor: Rahul, der Trollige (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Hast Du die Voodoo-Puppe schon griffbereit;-?

Fühlst du noch keine Schmerzen? Dann ist das Püppchen kaputt... ;-)

Autor: marc989 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leider kennen viele die De Morganschen Gesetze nicht, obwohl sie einem 
das Leben so vereinfach können :-))

Gruß Marc

Autor: Heike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, sorry!

Könnt ihr einer Anfängerin trotzdem noch helfen?

Ist das dann so richtig?
...
  DDRC &= ~( (1<<PC1) | (1<<PC3) | (1<<PC5) | (1<<PC7) );
  PORTC |= ~_BV(PC1) & ~_BV(PC3) & ~_BV(PC5) & ~_BV(PC7);

  DDRA &= ~( (1<<PA1) | (1<<PA3) | (1<<PA5) | (1<<PA7);
  PORTA |= ~_BV(PA1) & ~_BV(PA3) & ~_BV(PA5) & ~_BV(PA7);

  DDRG |= (1<<PG1);
  PORTG |= (1<<PG1);

Ich find das total unübersichtlich...

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist tatsächlich unübersichtlich. Warum machst Du es nicht immer auf 
dieselbe Weise? Meist werden die Bitmasken erst alle verODERt und dann 
invertiert, um Bits zu löschen, also:
REGISTER &= ~(_BV(BIT1) | _BV(BIT2) | _BV(BIT3)); //...usw
Beim Setzen der Bits dann einfach das UND durch ein ODER ersetzen und 
den Bitkomplement-Operator weglassen, also
REGISTER |= _BV(BIT1) | _BV(BIT2) | _BV(BIT3); //...usw
Alles klar? Ansonsten hilft das AVR-GCC-Tutorial weiter...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.