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...


Anmelden zum Antworten