PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : zwei Wege für Ausgabe über Port-Pin



joh_walt
19.05.2007, 18:41
Hallo,

ich beschäftige mich seit ein paar Tagen mit dem AVR µC und konnte bisher schon einiges im RN-Wiki lernen. Danke allen, die dort bisher ihr Wissen beigetragen haben.

Was ich versuche ist, Text über ein Videobild zu überlagern, also ein OSD.
Ziel ist, Bitmaps als Spannungsimpulse über SPI (schreiben über SPDR) zu senden. Ein zwei andere Projekte im Web machen das so.

Da das bisher nicht funktioniert, dachte ich daran, einfach einen Port-Ausgang für kurze Zeit auf aktiv zu schalten und damit eine Linie zu erzeugen. Das funktioniert mit folgendem Code (Port-Pin über Widerstand an Videosignal):


Init:
DDRB = 0x00;
PORTB = 0xFF;

im Interrupt:
DDRB |= (1<<DDB3);
Wait();
DDRB &= ~(1<<DDB3);

Der erwähnte Interrupt kommt von einem LM1881 und stellt den HSync des Videosignals dar.

Was ich nicht verstehe ist, weshalb folgender Code nicht zum gleichen Ergebnis führt:

Init:
DDRB = (1<<DDB3);
PORTB = ~(1<<PB3);

im Interrupt:
PORTB |= (1<<PB3);
Wait();
PORTB &= ~(1<<PB3);

Der Zustand des Pins zum Zielzeitpunkt ist doch der gleiche: Output und High. Eine LED bekomme ich auf beiden Wegen zum Blinken. Worin besteht also der Unterschied?

Grüße,
Johannes

Hubert.G
19.05.2007, 21:40
Im ersten Beispiel ist Port B Eingang und du schaltest nur den PullUp.
Was im zweiten Beispiel bei: PORTB = ~(1<<PB3); passiert ist mir nicht klar, warscheinlich nichts.
Das ganze im AVR-Studio simulieren und du weisst genau bescheid.

Hubert

Selbst schnell kontrolliert
Erstes Beispiel richtig beschrieben
Zweites, PB3 ist Ausgang, bei allen anderen Pin wird der PullUp aktiviert

joh_walt
20.05.2007, 13:54
Im ersten Beispiel ist Port B Eingang und du schaltest nur den PullUp.
Was im zweiten Beispiel bei: PORTB = ~(1<<PB3); passiert ist mir nicht klar, warscheinlich nichts.

Aber im Interrupt erfolgt ja jeweils eine Schaltung. Im ganzen: Im ersten Fall wird es doch als Eingang mit PullUp initialisiert und im Interrupt kurz auf High-Ausgang geschaltet.
Im zweiten Fall wird als Low-Ausgang initialisiert und kurz auf High-Ausgang geschaltet.

Aber das Ergebnis scheint verschieden zu sein.


Das ganze im AVR-Studio simulieren und du weisst genau bescheid.

Das kriege ich nicht hin, AVR-Studio stürzt immer sofort ab wenn ich den Debugger starte.

Johannes

Hubert.G
20.05.2007, 20:04
Du hast recht, ich habe nur die Initialisierung beachtet.
Du schaltest in ersten Fall in der ISR nur das DDRB und nicht das Port, also : Eingang - PullUp - ISR - Ausgang - Eingang . Der PullUp ist anschließend wieder aktiv.
Hubert