Ich glaub ich habe dir gestern falsche Daten gegeben in meiner Tabelle verlesen und habe die Gleichung für den FAST-PWM-Mode genutzt (Asche auf mein Haupt)
So Korrektur für den CTC-Mode bei 20Mhz für 100µs: Teiler = 8; OCR0A = $7c (124dez) = 100µs
CTC-Mode bei 20Mhz für 100µs: Teiler = 64; OCR0A = $0f (15dez) = 104µs
Tja und mit 100ms im CTC-Mode siehts schlecht aus.
jetzt zum Programm...
Versuche mal die ganze Initialisierung in kleine Unterprogramme zu packen
z.B.:
Code:
init_stack:
ldi temp, HIGH(RAMEND) ; Stackpointer
out SPH, temp
ldi temp, LOW(RAMEND)
out SPL, temp
rcall UART_Reset
loop: jmp loop
UART_Reset:
....
.....
ret
UART_Reset: ich hoffe du hast UBRR_VAL irgendwo definiert denn die Angabe fehlt in deinem Post.
Timer0_Reset: gut wäre es den Timer erst zu starten wenn du alle Timerinitalisierungen erledigt hast und du bist auch nicht m CTC-Mode weil WGM01 nicht gesetzt ist.
isUDRclear: sbis temp, 5 dieser Befehl bezieht sich auf die PORTS, du möchtest aber ein Register nutzen dann nutze SBRS ......
Code:
isUDRclear:
lds temp, UCSR0A ; Hier ist der Fehler LDS weil MOMERY MAPPED
sbrs temp, UDRE0 ; Überprüfe ob das UDR Register LEER ist !!! Hier ist der Fehler :" Invalid number"
rjmp isUDRclear ; Wenn nicht bleibt in einer Schleife bis es so ist.
sts UDR0, value
ret nop
> Wenn das so eingetippt wird, ist das UCSR0A Register nicht in der Range.
Code:
in r16, UCSRnA
sbrs r16, UDREn
In einen meiner Posts hatte ich es geschrieben, schau dir bitte mal die Inlcudedatei an, da steht bei einigen Registern MOMERY MAPPED und diese Register
werden mit LDS r16,UCSR0A geladen und mit STS gespeichert, einfach mal reinschauen
> Ich muss mir noch etwas einfallen lassen, wie ich die Ausgabe zum PC mache, ohne das interrupt zu verlängern und ohne es im Main Loop die ganze Zeit ausgeben zu
> lassen
Naja in dem du es Anforderst, du sendest über den PC ein 'A' und vergleichst es im µC wenn es stimmt machste ne Ausgabe.
hier mal überarbeitet
Code:
ldi temp, HIGH(RAMEND) ; Stackpointer
out SPH, temp
ldi temp, LOW(RAMEND)
out SPL, temp
ldi temp, ( (1<<PD2) | (1<<PD3) ) ; Interrupt Pins auf Eingang, der Rest bleibt als Ausgang
out DDRD, temp
ldi temp, 0xFF ; PORTB wird als Ausgang gesetzt
out DDRB, temp
ldi temp, 0x00
out PORTD, temp ; Alle Pins auf 0 setzen (Die beiden Eingänge bekommen keinen Pull-Up)
rcall UART_Reset
rcall Timer0_Reset
rcall Timer1_Reset
sei ;sonst wirds nix mit den INTS das ist die Globale Freigabe
Loop:
jmp Loop
Result_Output:
mov value, timer1_low ; Timerwert auf den USART geben
rcall isUDRclear
mov value, timer1_high ; Timerwert auf den USART geben
rcall isUDRclear
; rcall sync_0
jmp Loop
;***Init UART
UART_Reset:
ldi temp, HIGH(UBRR_VAL)
sts UBRR0H, temp
ldi temp, LOW(UBRR_VAL)
sts UBRR0L, temp
ldi temp, ( (1<<UMSEL00) | (1<<UCSZ01) | (1<<UCSZ00) ) ; synchron mit 8 Bit.
sts UCSR0C, temp
ldi temp, (1<<TXEN0)
sts UCSR0B, temp
ret
isUDRclear:
lds temp, UCSR0A
sbrs temp, UDRE0 ; Überprüfe ob das UDR Register LEER ist !!! Hier ist der Fehler :" Invalid number"
rjmp isUDRclear ; Wenn nicht bleibt in einer Schleife bis es so ist.
sts UDR0, value
ret
;****Iint_T0
Timer0_Reset:
ldi temp, (1<<COM0A1|1<<WGM01) ; der Ausgang wird immer beim Oberflow
out TCCR0A, temp ; immer auf LOW gesetzt
ldi temp, $7c ; 250 Schritte entsprechen genau 100us
out OCR0A, temp
ldi temp, (1<<OCIE0A) ; aktiviere Compare-Overflow Interrupt
sts TIMSK0, temp
ldi temp, (0<<CS02|1<<CS01|0<<CS00) ; setze Vorteiler auf 8
out TCCR0B, temp
ret
;***Init_T1
Timer1_Reset:
ldi temp, (1<<ICES1)
sts TIMSK1, temp
ret
;**********UP´s INT´s*************
Sound_On:
cbi PORTD, 6
reti
TIM0_COM:
/*Die Pegel auf LOW setzen brauch nicht implementiert werden,
da das von der HArdware gemacht wird*/
inc timer0
cpi timer0, 0x64 ; Damit wird der High Timer auf 10ms festgelegt.
breq Sound_On
reti
TIM1_CAP:
/*Hardware speichert Werte im RAM------>> nein Das ist nicht der RAM ganz normaler RegisterBereich wenn mit .equ timer1_low = $0100 festlegen*/
ldi timer1_low, TCNT1L
ldi timer1_high, TCNT1H
reti
Nachtrag: Schon mal überlegt auf´s AVR-Studio 4.19 zu wechseln ? Das 6er ist so ziemlich noch nicht das gelbe vom Ei. Funktioniert auch mit MK2.
Lesezeichen