PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ports schalten in CodevisionAVR



Cheffe Boss
02.08.2013, 12:38
Hallo,
versuche mich in Micro-Controller Programmierung.
Schon am Anfang habe ich eine Frage.

Warum funktioniert dieses Programm nicht?


while (1)
{
PORTA=(1<<PORTA0)|(1<<PORTA3);//rot anmachen

delay_ms(3000); //warten 3sec

PORTA=(1<<PORTA1)|(1<<PORTA4) //gelb dazu anmachen <-- wird zwar gemacht aber rot geht aus

// PORTA=(1<<PORTA1)|(1<<PORTA4)|(1<<PORTA0)|(1<<PORTA3); <---das hingegen funktioniert

delay_ms(1000); //warten 1sec
PORTA=(0<<PORTA0)|(0<<PORTA3); //Rot und
PORTA=(0<<PORTA1)|(0<<PORTA4); //gelb ausmachen
PORTA=(1<<PORTA2)|(1<<PORTA5); //Grün anmachen
delay_ms(3000) ; //Warten 3sec
PORTA=(1<<PORTA1)|(1<<PORTA4)|(1<<PORTA2)|(1<<PORTA5); //Gelb anmachen <--dito
delay_ms(1000); //Warten 1 sec
PORTA=(0<<PORTA2)|(0<<PORTA5); //grün ausmachen



}
Ganz einfache Schaltung: Rot-> 3 sek->Gelb DAZU->1 sek->Rot u. Geld aus->Grün->3 sek->Gelb dazu->1 sek Grün und Gelb aus.(Das ganze zwei mal,zwei Ampeln quasi)

Mein Problem ist in der Zeile Nummer 5(für Grün dito). Rot ist schon an,ich will nun Geld dazu schalten.Gelb wird auch zugeschaltet,aber leider geht dann Rot aus.

Ist das die Eigenschaft von Controllern?Oder mache ich einen Denkfehler?

Vielen Dank!

P.S: Ich schreibe in CodevisionAVR für Mega16. Als Simulator benutze ich Proteus. Leider habe ich noch keine Hardware (ist aber bestellt).Liegt es vlt an der Simulation?Wird das ,so wie ich das will, auf der echten Hardware funktionieren?


EDIT: Ach nun ist mir das wohl von alleine klar geworden:)so ziemlich direkt nach dem klicken auf "Abschicken"....


PORTA=(1<<PORTA0)|PORTA=(1<<PORTA1)
ist wohl nichts anderes als

PORTA=0b00000011;
Deswegen setzt die Zeile Nummer 5 die beiden Ports von ROT wieder auf 0..
Liege ich damit richtig?
Also bleibt als Lösung immer neu zuweisen ?

PORTA=(1<<PORTA1)|(1<<PORTA4)|(1<<PORTA0)|(1<<PORTA3);

Hubert.G
02.08.2013, 13:14
Ich weiss nicht ob es im CodeVision auch so ist.
Aber wenn du die vorhandenen Porteinstellungen nicht verändern willst, nur neu dazu, dann sollte es so sein:

PORTA|=(1<<PORTA0)|(1<<PORTA1);

Cheffe Boss
02.08.2013, 13:46
Jop!Funktioniert!
Warum bin ich nicht von alleine drauf gekommen :)
"ODER"-Maske
Vielen Dank!

Cheffe Boss
02.08.2013, 16:07
Eine andere Frage:
Um dem Fussgänger zu ermöglichen rüberzugehen,muss ich eine Tastereingabe auslesen.Muss ich dafür die (noch) geheimnissvollen Interrupte bemühen oder geht das in einer Schleife?

Das Problem welches ich zZ habe: Wenn ich es mit "IF" mache, dann musste ich den Taster wohl solange gedrückt halten bis die while(1)-schleife von vorne beginnt.

Hubert.G
03.08.2013, 08:26
Tastenabfrage über Pollen ist sicher kein Problem, es muss nur das Tastenprellen berücksichtigt werden.
In eine while-Schleife baut man aus diesem Grund auch keine delay ein.
Verzögerungen und dergleichen macht man über Timer. Man startet einen z.B. 10msek Takt und zählt diesen.
Dadurch bleibt die while-Schleife schnell.