Forum: Mikrocontroller und Digitale Elektronik AVR-ASM M8 USART-Funk problem


von Fritzl W. (friz)


Angehängte Dateien:

Lesenswert?

Ich habe seit Tagen ein Problem mit meinem 433Mhz Funk.
Gesendet wird aus einem Atmega644 über ein Funkmodul (aus unserer Firma)
zum passenden Empfänger an einen Atmega8, welcher am HTerm ausgeben
soll.

Meine Beobachtungen: Controller funkt richtig an Empfängermodul (300Baud
bei 1Mhz UBRR=207). Am ist am Hterm (FTDI) alles wunderbar abzulesen.
Also funktioniert!?
Ein kurzes Programm am M8 soll 8 Bytes einlesen, richtig ordnen, (nach 
0x0f zu lesen beginnen) und dann über FTDI am PC anzeigen zur Kontrolle. 
Und da liegt mein Problem.
Der M8 liest alle 8 Bytes ein und gibt dann blödsinn aus sobald er mehr
als 6 Bytes wieder ausgeben soll. Auf den Bildern ist zu sehen wie es 
aussehen sollte bei 6 BYTES und wie es bei 8 Bytes aussieht.

Es soll ein kontinuierlicher Zeichenstrom am Empfänger ankommen der
immer gleich bleibt wenn keine Taste gedrückt ist damit ich die 
Steuerung dann richtig auf die Antribe ummünzen kann.

Ich weiss nicht ob es am Programm liegt oder an der übertragung zum pc 
)FTDI-Baudrate). Ich hatte bis jetzt noch nie einen Quarz bei Usart 
gebraucht. Vielleicht liegts daran.?!
1
 * rosnmara.asm
2
 *
3
 *  Created: 27.05.2015 16:44:53
4
 *   Author: zigein
5
 */ 
6
   .include "m8def.inc"
7
;
8
;
9
 .def  usart1    =  r0  ;BYTE1: USART Empfangsspeicher
10
 .def  usart2    =  r1  ;BYTE2: USART Empfangsspeicher
11
 .def  usart3    =  r2  ;BYTE3: USART Empfangsspeicher
12
 .def  usart4    =  r3  ;BYTE4: USART Empfangsspeicher
13
 .def  usart5    =  r4  ;BYTE5: USART Empfangsspeicher
14
 .def  usart6    =  r5  ;BYTE6: USART Empfangsspeicher
15
 .def  usart7    =  r6  ;BYTE7: USART Empfangsspeicher
16
 ;
17
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
18
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAKROS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
19
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
20
 .macro warte
21
     ldi     r19,  255
22
     ldi     r18,  255
23
 delay1:  dec    r19
24
      brne  delay1  
25
      ldi    r19,  255
26
      dec    r18
27
      brne  delay1
28
.endm
29
 .cseg            
30
 .org 0x000;;;;;;;;;;Interrupt Einsprung-Adressen
31
rjmp  reset          ; RESET 
32
reti      ; INT0 External Interrupt Request 0
33
reti      ; INT1 External Interrupt Request 1
34
reti      ; TIMER2 COMP Timer/Counter2 Compare Match
35
reti      ; TIMER2 OVF Timer/Counter2 Overflow
36
reti      ; TIMER1 CAPT Timer/Counter1 Capture Event
37
reti      ; TIMER1 COMPA Timer/Counter1 Compare Match A
38
reti      ; TIMER1 COMPB Timer/Counter1 Compare Match B
39
reti      ; TIMER1 OVF Timer/Counter1 Overflow
40
  reti      ; TIMER0 OVF Timer/Counter0 Overflow
41
  reti      ; SPI, STC Serial Transfer Complete
42
  reti      ; USART, RXC USART, Rx Complete
43
  reti      ; USART, UDRE USART Data Register Empty
44
  reti      ; USART, TXC USART, Tx Complete
45
  reti      ; ADC ADC Conversion Complete
46
  reti      ; EE_RDY EEPROM Ready
47
  reti      ; ANA_COMP Analog Comparator
48
  reti      ; TWI Two-wire Serial Interface
49
  reti      ; SPM_RDY Store Program Memory Ready
50
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
51
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; RESET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
52
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
53
  reset:  
54
    ldi    r16, high(ram
55
     out    sph,  r16
56
    ldi    r16,  low(ramend)
57
    out    spl,  r16
58
;
59
;;;;;;;;;;;;;;;;;;;Ports initialisieren;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
60
;        
61
        ldi  r16,  (1<<RXEN)|(1<<TXEN)    
62
   out  UCSRB,  r16
63
   ldi     r16,  (1<<UCSZ1)|(1<<UCSZ0)  ; 8-Bit-modus
64
   sts  UCSRC,  r16
65
   ldi  r16,  207        
66
   out  UBRRL,  r16    
67
;
68
loop:
69
  
70
  sbis  UCSRA,    rxc        
71
rjmp    loop
72
  in  usart1,    udr        
73
  ldi  r16,    0xf0
74
  cp  usart1,    r16  ; nur wenn erstes Byte 0xf0, 
75
  breq  usartgo    
76
  cbi  portb,    2
77
rjmp          loop
78
;
79
usartgo:
80
  sbi  portb,    2
81
uart1:
82
   sbis  UCSRA,    rxc      
83
  rjmp  uart1
84
  in  usart1,    udr        
85
uart2:
86
   sbis  UCSRA,    RXC        
87
   rjmp  uart2
88
   in  usart2,    udr        
89
uart3:
90
  sbis  UCSRA,    RXC    
91
  rjmp  uart3
92
  in  usart3,    udr    
93
uart4:
94
  sbis  UCSRA,    RXC  
95
        rjmp  uart4
96
  in  usart4,    udr        
97
uart5:
98
  sbis  UCSRA,    RXC  
99
  rjmp  uart5
100
  in  usart5,    udr        ; ;  
101
uart6:
102
  sbis  UCSRA,    RXC    
103
  rjmp  uart6
104
  in  usart6,    udr          
105
uart7:
106
  sbis  UCSRA,    RXC  
107
  rjmp  uart7
108
  in  usart7,    udr
109
warte
110
111
usart_tx0:
112
  sbis  ucsra,    udre      
113
  rjmp usart_tx0
114
  ldi  r17,    0x0f
115
  out  udr,    r17
116
usart_tx1:
117
  sbis  ucsra,    udre    
118
  rjmp usart_tx1
119
  out  udr,    usart1    
120
usart_tx2:
121
  sbis  ucsra,    udre    
122
  rjmp usart_tx2
123
  out  udr,    usart2    
124
usart_tx3:
125
  sbis  ucsra,    udre  
126
  rjmp usart_tx3
127
  out  udr,    usart3    
128
usart_tx4:
129
  sbis  ucsra,    udre  
130
  rjmp usart_tx4
131
  out  udr,    usart4    
132
usart_tx5:
133
  sbis  ucsra,    udre      
134
  rjmp usart_tx5
135
  out  udr,    usart5    
136
;
137
usart_tx6:
138
  sbis  ucsra,    udre  
139
  rjmp usart_tx6
140
  out  udr,    usart6    
141
usart_tx7:
142
  sbis  ucsra,    udre  
143
  rjmp usart_tx7
144
  out  udr,    usart7    
145
  rjmp  loop

: Bearbeitet durch User
von S. Landolt (Gast)


Lesenswert?

> Ein kurzes Programm am M8 soll 8 Bytes einlesen

Der Empfangsteil ist doch nur für 7 Bytes ausgelegt, danach startet das 
Senden - ich verstehe es nicht.


Nur am Rande:
>  ldi     r16,  (1<<UCSZ1)|(1<<UCSZ0)  ; 8-Bit-modus
>  sts  UCSRC,  r16
Das ist doppelt falsch: es fehlt URSEL und es wird ins SRAM geschrieben.

von Fritzl W. (friz)


Angehängte Dateien:

Lesenswert?

S. Landolt schrieb:
> Der Empfangsteil ist doch nur für 7 Bytes ausgelegt, danach startet das
> Senden - ich verstehe es nicht.

Das Erste Byte ist für die Synchronisation, die nächsten 7 werden für 
die verarbeitung gebraucht. (3Bytes für die Tsten und 4 Bytes für die 
Analogsticks des PS-Controllers). Ich verschicke die 7 Bytes nur zum 
Testen ob alles richtig ankommt. Der Teil im Programm der Sendet kommt 
dann später weg wenn die Funkferbindung für meine Anwendung passt.

S. Landolt schrieb:
>>  ldi     r16,  (1<<UCSZ1)|(1<<UCSZ0)  ; 8-Bit-modus
>>  sts  UCSRC,  r16
> Das ist doppelt falsch: es fehlt URSEL und es wird ins SRAM geschrieben.

"Ursel" eingefügt und "OUT" ausgebessert, ohne Erfolg, aber Danke für 
den Hinweis.

Mir ist gerade aufgefallen, das jeder 2. Sendevorgang korrekt ist also 
vermute ich das es ein Fehler im Programm ist.

: Bearbeitet durch User
von S. Landolt (Gast)


Lesenswert?

Sehe ich das richtig: zwischen diesen 8-Byte-Paketen des 644 liegen 
mindestens rund 250 ms?

von Fritzl W. (friz)


Lesenswert?

Puh, das habe ich nicht nachgemesessen.
Was wäre das Problem?

Hab mir 8 Leds an den M8 gehängt und auf die Bytes reagieren lassen (im 
Programm).
Bei jedem Tastendruck leuchtet das richtige Led. Auch am Oszi sind keine 
spitzen erkennbar, auch nicht an den nackten Pins ohne Led. Die annahme 
(RX) sollte also funktionieren.

von S. Landolt (Gast)


Lesenswert?

> Was wäre das Problem?

Nachdem der ATmega8 das 8. Byte empfangen hat, wartet er 65 ms, 
anschließend sendet er 267 ms lang; da das letzte Byte im Sendepuffer 
übernommen wird, haben wir in der Summe rund 300 ms. Die 
Empfangshardware hat einen 'two-level-FIFO', also darf frühestens nach 
rund 235 ms wird etwas hereinkommen, sonst gehen Empfangsdaten verloren.

von S. Landolt (Gast)


Lesenswert?

Okay, aber wegen des Synchronisationsbytes dürften nur komplette Blöcke 
verschwinden. Jetzt weiß ich erstmal nicht weiter.

von Fritzl W. (friz)


Lesenswert?

Ohhh ja, Bitte nochmal für den DAU.

Was ist mit der Empfangshardware gemeint? Sollte ich ein Delay zwischen 
empfangen und ausgeben einbauen?

Empfangsdaten gehen permanent verloren. Der M8 soll auch nur Bytes lesen 
wenn er mit dem erledigen seiner Aufgaben fertig ist. Erst dann soll er 
wieder lauschen was seine nächsten Aufgaben sind. Danach wird eventuell 
verglichen oder kontrolliert und dann reagiert, bis er wieder lauscht 
wies weitergeht.

Nochmal, das der M8 über FTDI(USART) mit dem PC verbunden ist und die 
Daten wieder ausgiebt ist nur eine Hilfestellung für mich damit ich den 
Sendevorgang überwachen kann. So eine art Debugleitung zum selber 
programmieren. Sehr primitiv und umständlich, aber .....so bin ich!

S. Landolt schrieb:
> Jetzt weiß ich erstmal nicht weiter.
Danke fürs drüberschaun

: Bearbeitet durch User
von S. Landolt (Gast)


Lesenswert?

Ich glaube weniger, dass es am internen RC-Oszillator liegt, aber die 
Quarzfrage lässt sich leicht entscheiden, indem man um +- 2 % verstellt, 
also UBRRL auf 203 bzw. 211 setzt und schaut, ob es funktioniert.

von S. Landolt (Gast)


Lesenswert?

Ihn dünkt, er säh' 'nen Friederich
  in der Autorenzeile.
Er guckt' noch mal, und merkt', es war
  die Brille nicht mehr heile.
"Bis Montag dauert es", sprach er,
  "doch eine ganze Weile."

von Fritzl W. (friz)


Angehängte Dateien:

Lesenswert?

Ich habe an dem Programm nichtz geändert und seit gestern den Rasenmäher 
im Betrieb und der Funk macht keine Probleme. Nichtmal die Lichtmaschine 
neben über dem Empfänger oder der die ZündSpule(Zündkerze) machen 
Probleme. Danke fürs Drüberschaun.

: Bearbeitet durch User
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.