Hallo, ich habe in den Application Notes von Atmel einen RC5 Empfänger gesehen. Da dies mein erster Versuch mit einem Microcontroller ist dachte ich mir das wär das beste etwas fertiges zu nehmen und das zu modifizieren. Ich habe den Quelltext aus dem Uarttutorial genommen und wollte ihn in das Atmel programm einbinden. Ich habe schon ein wenig rumexperimentiert, bisher hat aber nichts funktioniert. Ich erhalte über die RS232 Schnittstelle Fragezeichen Anstelle der Werte der Register. Daraufhin habe ich den Wert im Register um eins erhöht. Anschliessend erhielt ich keine Werte für die Register.(nichtmal ein ? oder eine 0) Wie kann ich diese Register übertragen das sie vom PC verstanden werden? Der Codeausschnitt für ein Register: ldi temp1,'1' ; Unterprogramm aufrufen add command,temp1 mov tempUART, command rcall serout ; RS232 Senden Hier der komplette Code: .include "m8def.inc" .equ INPUT =2 ;PD2 .equ SYS_ADDR =0 ;The system address .def S =R0 .def inttemp =R1 .def ref1 =R2 .def ref2 =R3 .def temp =R16 .def timerL =R17 .def timerH =R18 .def system =R19 .def command =R20 .def bitcnt =R21 .def tempUART = R22 .def temp1=R23 .equ CLOCK = 4000000 .equ BAUD = 9600 .equ UBRRVAL = CLOCK/(BAUD*16)-1 .cseg .org 0 rjmp reset ;******************************************************************** ;* "TIM0_OVF" - Timer/counter overflow interrupt handler ;* ;* The overflow interrupt increments the "timerL" and "timerH" ;* every 64us and 16,384us. ;* ;* Number of words: 7 ;* Number of cycles: 6 + reti ;* Low registers used: 1 ;* High registers used: 3 ;* Pointers used: 0 ;******************************************************************** .org OVF0addr TIM0_OVF: in S,sreg inc timerL ;Updated every 64us inc inttemp brne TIM0_OVF_exit inc timerH TIM0_OVF_exit: out sreg,S reti ;******************************************************************** ;* Example program ;* ;* Initializes timer, ports and interrupts. ;* ;* Calls "detect" in an endless loop and puts the result out on ;* port B. ;* ;* Number of words: 16 ;* Low registers used: 0 ;* High registers used: 3 ;* Pointers used: 0 ;******************************************************************** reset: ;ldi temp,low(RAMEND) ;Initialize stackpointer ;out SPL,temp ;ldi temp,high(RAMEND) ; Commented out since 1200 does not hae SRAM ;out SPH,temp ;UartAktivieren ; Stackpointer initialisieren ldi tempUART, LOW(RAMEND) out SPL, tempUART ldi tempUART, HIGH(RAMEND) out SPH, tempUART ; Baudrate einstellen ldi tempUART, LOW(UBRRVAL) out UBRRL, tempUART ldi tempUART, HIGH(UBRRVAL) out UBRRH, tempUART ; Frame-Format: 8 Bit ldi tempUART, (1<<URSEL)|(3<<UCSZ0) out UCSRC, tempUART sbi UCSRB,TXEN ; TX aktivieren ;RC5 ldi temp,1 ;Timer/Counter 0 clocked at CK out TCCR0,temp ldi temp,1<<TOIE0 ;Enable Timer0 overflow interrupt out TIMSK,temp sei ;Enable gobal iterrupt main: rcall detect ;Call RC5 detect routine cpi system,SYS_ADDR ;Respponds only at the specified address brne release main1: andi command,0x3F ;Remove control bit ;if not command then goto keinuart ldi tempUART, 'C' rcall serout ; Unterprogramm aufrufen ldi tempUART, ':' rcall serout ldi temp1,'1' ; Unterprogramm aufrufen add command,temp1 mov tempUART, command rcall serout ldi tempUART, 'S' rcall serout ldi tempUART, ':' rcall serout ldi temp1,'1' add system,temp1 mov tempUART, system rcall serout ldi tempUART, 10 rcall serout ldi tempUART, 13 rcall serout keinuart: rjmp main release: clr command ;Clear PORTB rjmp main1 serout: sbis UCSRA,UDRE ; Warten bis UDR für das nächste ; Byte bereit ist rjmp serout out UDR, tempUART ret ; zurück zum Hauptprogramm ;******************************************************************** ;* "detect" - RC5 decode routine ;* ;* This subroutine decodes the RC5 bit stream applied on PORTD ;* pin "INPUT". ;* ;* If successe: The command and system address are ;* returned in "command" and "system". ;* Bit 6 of "command" holds the toggle bit. ;* ;* If failed: $FF in both "system" and "command" ;* ;* Crystal frequency is 4MHz ;* ;* Number of words: 72 ;* Low registers used: 3 ;* High registers used: 6 ;* Pointers used: 0 ;******************************************************************** detect: clr inttemp clr timerH detect1: clr timerL detect2: cpi timerH,8 ;If line not idle within 131ms brlo dl1 rjmp fault ; then exit dl1: cpi timerL,55 ;If line low for 3.5ms brge start1 ; then wait for start bit sbis PIND,INPUT ;If line is rjmp detect1 ; low - jump to detect1 rjmp detect2 ; high - jump to detect2 start1: cpi timerH,8 ;If no start bit detected brge fault ;within 130ms then exit sbic PIND,INPUT ;Wait for start bit rjmp start1 clr timerL ;Measure length of start bit start2: cpi timerL,17 ;If startbit longer than 1.1ms, brge fault ; exit sbis PIND,INPUT rjmp start2 ;Positive edge of 1st start bit mov temp,timerL ;timer is 1/2 bit time clr timerL mov ref1,temp lsr ref1 mov ref2,ref1 add ref1,temp ;ref1 = 3/4 bit time lsl temp add ref2,temp ;ref2 = 5/4 bit time start3: cp timerL,ref1 ;If high periode St2 > 3/4 bit time brge fault ; exit sbic PIND,INPUT ;Wait for falling edge start bit 2 rjmp start3 clr timerL ldi bitcnt,12 ;Receive 12 bits clr command clr system sample: cp timerL,ref1 ;Sample INPUT at 1/4 bit time brlo sample sbic PIND,INPUT rjmp bit_is_a_1 ;Jump if line high bit_is_a_0: clc ;Store a '0' rol command rol system ;Synchronize timing bit_is_a_0a: cp timerL,ref2 ;If no edge within 3/4 bit time brge fault ; exit sbis PIND,INPUT ;Wait for rising edge rjmp bit_is_a_0a ;in the middle of the bit clr timerL rjmp nextbit bit_is_a_1: sec ;Store a '1' rol command rol system ;Synchronize timing bit_is_a_1a: cp timerL,ref2 ;If no edge within 3/4 bit time brge fault ; exit sbic PIND,INPUT ;Wait for falling edge rjmp bit_is_a_1a ;in the middle of the bit clr timerL nextbit: dec bitcnt ;If bitcnt > 0 brne sample ; get next bit ;All bits sucessfully received! mov temp,command ;Place system bits in "system" rol temp rol system rol temp rol system bst system,5 ;Move toggle bit bld command,6 ;to "command" ;Clear remaining bits andi command,0b01111111 andi system,0x1F ret fault: ser command ;Both "command" and "system" ser system ;0xFF indicates failure ret
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.