Blinkprogramm
-
Ich bin dabei ein Programm zu schreiben dass mit Hilfe des ADCs Spannungen in digitale Signale umwandelt und diese dann via USART weiter schickt.
Ein Teil davon klappt ja schon aber ich will das immer nur nach einer Sekunde gesendet wird.
Da das nicht funktioniert hat hab ich den Programmcode genommen und wollte aus dem Timer Teil mal ein Blinkprogramm für die LED am PD7 schreiben.
In der Simulation geht alles eigentlich richtig nur beim ausgeben blinkt die LED VIEL ZU SCHNELL.
Würd mich freuen wenn mir jemand sagen kann was falsch ist und ob es überhaupt an der Software liegt.Hier der Code:
.nolist .include "m644def.inc" .def akku = r16 .def teiler = r18 .def data = r19 ;*********************Initialisierung***************************** reset: rjmp start .org INT_VECTORS_SIZE .org OC1Aaddr rjmp toggle start: init: ldi akku,LOW(RAMEND) out spl,akku ldi akku,HIGH(RAMEND) out sph,akku ldi akku,$ff out DDRD,akku initTimer1: ;Prescaler 256 (CS) und CTC Mode (WGM) setzen lds akku,TCCR1B ldi akku,(1<<WGM12|1<<CS12) sts TCCR1B,akku ;Compare Match auf 62500 setzen da 256*62500 = 16MHz lds akku,OCR1AL ldi akku,0b00100100 sts OCR1AL,akku lds akku,OCR1AH ldi akku,0b11110100 sts OCR1AH,akku ;OCR1A Interrupt enablen lds akku,TIMSK1 ldi akku,(1<<OCIE1A) sts TIMSK1,akku sei main: rjmp main toggle: sbis PIND,7 rjmp setzen cbi PORTD,7 reti setzen: sbi PORTD,7 reti
-
Es waere sicher hilfreich, wenn du noch verraten wuerdest, welchen Controller du genau verwendest.
Dann zunaechst mal einige grundlegende Sachen in deinem Code, die mir in's Auge gesprungen sind:
16Bit-Register werden immer zuerst High und dann Low beschrieben. Lesen dagegen zuerst Low, dann High. Anders klappt's nicht!
In Register wie TCCRnx, etc. wird mit dem Befehl "out" geschrieben.
Wozu laedst du in Zeile 34, 39, 43, 48 ... jeweils akku 2mal direkt hintereinander und dazu zunaechst noch aus dem SRAM?Ansonsten empfehle ich mal die Lektuere des AVR-Tutorials auf mikrocontroller.net und des Datenblattes deines Controllers...