Forum: Mikrocontroller und Digitale Elektronik Rechtecksignal vom PB3 auf PortA bei Atmega32 umleiten??


von Kaveh D. (kaveh)


Lesenswert?

Hallo zusammen,
ich habe hier ein Atmega32 und mit dem möchte ich eine kleine Steuerung 
realisieren und zwar in Assemblersprache. Es sind 6 Schalter, die 
abgefragt werden, ob die geschlossen oder offen sind. für jeden Schalter 
ist eine LED vorgesehen. wenn der Schalter offen ist, muss die LED 
blinken und wenn der Schalter geschlossen ist muss die LED permanent 
leuchten.
man kann mit dem Timer0 die Blinkfunktion realisieren, die wird am 
PB3(OC0)
ausgegeben, das kann ich in ein Unterprogramm unterbringen und immer 
wieder aufrufen lassen. die 6 LED sind an PortA angeschlossen. Nun ist 
meine Frage, wie kann ich das Signal(Rechteck), das am PB3 ausgegeben 
wird zum PortA weiter leiten? für jeden Tipp wäre ich dankbar
mfg
kaveh

.include"m32def.inc"   rjmp   main
.def  temp=r16

main:             ldi     temp,high(ramend)
                  out     sph,temp
                  ldi     temp,low(ramend)
                  out     spl,temp

                  sbi     portb,3            ;PB3 (OC0)
;Timer0 init
LOOP:             ldi     temp,0b00010101    ;vorteiler 1024
                  out     TCCR0,temp
                  ldi     temp,ob00000010
                  out     TIMSK,temp
                  rjmp    LOOP


wie kann ich dem Controller sagen, er solle das, was am portb.3 passiert 
an prorA0 bis portA5 weiter leiten?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Es ist bestimmt nicht nötig, den Timer0 innerhalb einer Schleife (LOOP) 
zu initialisieren. Es kann sogar der Programmfunktion schaden.

> LOOP:            ldi     temp,0b00010101    ;vorteiler 1024
>                  out     TCCR0,temp

Halbwegs OK ist, dass du wenigstens im Kommentar hingeschrieben hast, 
was du machen willst.

>                  ldi     temp,ob00000010
>                  out     TIMSK,temp

Leider ist das hier schon nicht mehr der Fall. Jemand der das 
kontrollieren mächte, kommt ohne Datenblatt nicht aus. Du machst es 
anderen (und dir) unnötig schwer.

Einfacher lesbar und portabler ist es, wenn du mit den Techniken aus 
Bitmanipulation und den symbolischen Namen für die betreffenden Bits 
arbeitest, die Atmel dafür definiert hat.

>                  sbi     portb,3            ;PB3 (OC0)
>                  ...
>                  ldi     temp,ob00000010
>                  out     TIMSK,temp

Wenn die vierte Zeile einen Timerinterrupt anschaltet (was ich zu faul 
bin im Datenblatt nachzuschlagen), ist das Toggeln an PORTB.3 in Zeile 1 
nur das Ergebnis eines sich wiederholenden RESET des AVR, weil die 
zugehörige ISR fehlt. Wenn ich gerade über spanische Dörfer schreibe, 
lies das AVR-Tutorial über den Timer und über Interrupts.

von Kaveh D. (kaveh)


Lesenswert?

Hi,
ich denke, ich habe mein problemm ziemlich deutlich beschrieben. es geht 
hier nicht um Timer0 sondern darum wie ich das toggel-signal am portb.3 
auf den PortA umleiten kann. die Tatsache ist, wenn ich Timer0 so 
programmiere:
Im TCCR0-Register WGM00=0 , WGM01=0 (non-pwm Mode) und im TIMSK-Register 
OCIE0=1 setze, dann habe ich am Ausgang PB3 (pin4) eine Rechtecksignal 
und wenn ich eine LED dort anschließe, dann blinkt diese LED mit 
CLK/1024 in diesem Fall weiter. Aber ich will die LED nicht an diesem 
Port anschließen snodern an z.b
portA.0 oder portA.1 meine Frage war, wie ich das machen kann und nicht 
wie ich eine Timer und interrapt programieren kann?
mfg
kaveh

von Rudi (Gast)


Lesenswert?

> im TIMSK-Register OCIE0=1 setze, dann habe ich am Ausgang PB3 (pin4) eine 
Rechtecksignal.
logisch: wie schon gschrieben, wenn Du OCIE0 aktivierst und du den 
Interrupt nicht anspringst, gibt es einen Reset.
Eigntlich nicht mal das, der Controller springt die ersten Male an die 
Adresse im Flash, welche ich der Interrupttabelle
eben für den OCIE0 angegeben ist (steht im Datenblatt). Selbst wenn 
zufällig an dieser Stelle ausführbarer Code vorliegt, und eine halbwegs 
sinnvolle Abbarbeitung des Codses ausgegangen werden kann, fehlt "RETI" 
und der Stack läuft irgendwann über. DANN aber gibt es wirklich einen 
Reset, also spätestens jetzt. Um deine LED am OC0 blinken zu lassen, ist 
NICHT notwendig, den OCIE0 zu aktivieren. Das brauchst Du erst - und 
damit kommen wir auf deine Frage zu sprechen - wenn die LED an einem 
anderen Protpin wackeln soll. Im OCIE0 Inetrrupt schatest Du den Portpin 
um, an welchem die LED jetzt hängen soll.
Dazu brauchst Du eine Interrupteinsprungtabelle und eine 
korresponiderende Routine, die mit RETI abgeschlossen ist.

Schreibfehler behalten, bitte - bin mobil

von spess53 (Gast)


Lesenswert?

Hi

>wie kann ich dem Controller sagen, er solle das, was am portb.3 passiert
>an prorA0 bis portA5 weiter leiten?

Wie jetzt? ein Bit nach sechs Bits?

MfG Spess

von fu (Gast)


Lesenswert?

Kaveh Deiport schrieb:
> portA.0 oder portA.1 meine Frage war, wie ich das machen kann und nicht
> wie ich eine Timer und interrapt programieren kann?
du arroganter trottel genau das willst du wissen

von Kaveh D. (kaveh)


Lesenswert?

Hallo nochmal,
fu schrieb:
> Kaveh Deiport schrieb:
>> portA.0 oder portA.1 meine Frage war, wie ich das machen kann und nicht
>> wie ich eine Timer und interrapt programieren kann?
> du arroganter trottel genau das willst du wissen

ich habe mir überlegt, ob ich Dir über das, was Du mir oben als Antwort 
in Deinem sehr "fachlichen Kommentar" geschrieben hast, etwas sagen 
sollte.
es tut mir aber Leid, da fehlt mir auf der schnelle garnicht. weiß Du, 
es ist nämlich so, dass selten mit solchen idioten wie Dir kommuniziere. 
Ich kann Dir nur sagen, wenn Du vom etwas keine Ahnung hast, dann hält 
einfach Dein Maul.
in dem Sinne
kaveh

PS: Mein Dank geht an die anderen, die eine vernüftige Antwort 
geschrieben haben

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.