000
11.05.2004, 15:57 Uhr
xxyy
|
Hallo Leute,
und zwar wollte ich zunächst nur "ganz einfach" eine Ampelsteuerung für eine Kreuzung simmulieren (ohne Fussgängerampel). Nur ich habe ein Problem damit das zu automatisieren.
Hier mal mein Quellcode bisher.
Code: |
include Reg_51.PDF
EAL bit 0AFh B_freq equ 305 //Die Zustandsänderung nach 2 Sec., deshalb Wert 305
cseg at 0 jmp init
org 0BH Time_int0: call loop reti
init: mov r2,#B_freq setb IT0 setb EX0 setb EAL setb ET0 mov TMOD,#00000001b mov TCON,#00010000b
Loop: MOV DPTR,#tab PUSH 0E0h MOVC a,@A+DPTR MOV P1,a POP 0E0h djnz r2,back
back: cjne r2,#0,loop mov r2,#b_freq inc a sjmp loop tab: db 00100001b, 00110010b, 00001100b end
|
Ich erläutere jetzt mal einfach kurz was die Zustände bedeuten sollen. Also der erste Zustand ist ja "00100001". Die ersten drei Bits "001" sind für die eine Straße der Kreuzung und "100" für die andere. Also bei "001" ist diese grün und die andere hat bei "100" rot.
Der Quellcode den ich hier angegeben habe, führt einfach die Zustandsänderungen nach 2 Sekunden durch. Ich hoffe dass er bis dahin richtig ist.
Nun zu meinem Problem.
Ich will das so machen, dass "00100001" so lange der Zustand ist bis z.B. am Port 3.2 ein Interrupt ausgelöst wird (also z.B. wenn P 3.2 auf 1 gesetzt wird)und dann erst diese Zustandsänderungen durchgeführt werden.
Und wenn diese durchgeführt wurden (nun hat die andere Straße rot und die andere grün), dann soll auf einen "Interrupt" am Port P 3.3 gewartet werden. Wenn das Signal am P 3.3 eintrifft, dann soll der Zustand (dieser ist nicht in der Wertetabelle abgespeichert) "010110" erfolgen und eben nach 2 Sekunden wieder das ganze Programm von neu laufen.
Denn bei "010110" bekommt die eine die nun grün hatte Rot-Gelb und die anderen Gelb. Und dann soll eben wieder das alles von neu laufen, also gewartet werden bis am P 3.2 ein Interrupt ausgelöst wird.
Ich hoffe das ist verständlich ausgedrückt.
Ich würde mich über Hilfe sehr sehr freuen!! Danke!!! |