1 | #define F_CPU 8000000UL
|
2 | #define BAUDRATE 19200
|
3 | #define PRESCALE 16
|
4 |
|
5 | #include <avr/io.h>
|
6 | #include <avr/interrupt.h>
|
7 |
|
8 | uint16_t BIT_TIME = ((F_CPU / BAUDRATE / PRESCALE)-1); //Bitrate definieren
|
9 |
|
10 | /*******************************************/
|
11 | void UART_INIT (void)
|
12 | {
|
13 | LINBRRH |= (unsigned char)(((unsigned short)BIT_TIME)>>8);
|
14 | LINBRRL |= (unsigned char) ((unsigned short)BIT_TIME);
|
15 |
|
16 | LINCR |= (1<<LENA); //UART enablen
|
17 |
|
18 | LINCR |= (1<<LCMD2); //
|
19 | LINCR |= (1<<LCMD1); //full duplex
|
20 | LINCR |= (1<<LCMD0); //
|
21 | }
|
22 | /*******************************************/
|
23 | unsigned char UART_RX (void)
|
24 | {
|
25 | while (LINSIR & (1 << LBUSY));
|
26 | return LINDAT;
|
27 | while ((LINSIR & (1<<LRXOK)));
|
28 | }
|
29 | void UART_TX (unsigned char data)
|
30 | {
|
31 | while (LINSIR & (1 << LBUSY));
|
32 | LINDAT = data;
|
33 | while (!(LINSIR & (1<<LTXOK)));
|
34 | }
|
35 | void TX_UART (void)
|
36 | {
|
37 | UART_TX (0xFF);
|
38 | }
|
39 | /*******************************************/
|
40 | int main (void)
|
41 | {
|
42 | PORTA &= ~(1<<PA1); //TX
|
43 |
|
44 | UART_INIT();
|
45 |
|
46 | sei();
|
47 |
|
48 | while(1)
|
49 | {
|
50 | }
|
51 | }
|
52 | ISR(LIN_TC_vect)
|
53 | {
|
54 | cli();
|
55 |
|
56 | TX_UART();
|
57 |
|
58 | sei();
|
59 | }
|
Hallo liebe Forengemeinde,
ich hoffe ihr könnt mir helfen. Ich benutze einen attiny87 im UART mode.
Oben ist der jeweilige code und im Bild sieht mann das Ergebnis am
TX-pin. Mein Problem ist folgendes: Wie im Bild ersichtlich, geb ich
ist mein ganzes Signal 1,14 ms lang. Das LOW vorne (start bit vom UART)
ist jedoch 104 µs lang. Im Datenblatt steht das standardmäßig 8,N,1
vorhanden ist. Das Problem ist jedoch, dass ich dort 11 Bit habe,
anstatt 10. Normal ist ja Startbit - 8 Datenbit - 1 Stopbit.
Guck ich mir am PC an was ankommt ist alles i.O., jedoch muss ich genau
werden und wirklich die einzelne Bitlänge von 100µs haben, also
komplette Signallänge von 1000µs und nicht 1100µs.
Hat jemand von euch schon mit dem 87er gearbeitet und kennt nen Trick?
Mit nem Mega ist das alles kein Thema, aber mit dem tiny hab ich echt
Schwierigkeiten. Falls Fragen kommen, ich muss den tiny verwenden (hat
persönliche Gründe).
Wäre echt Dankbar über jegliche Hilfestellung.
Gruß,
Mario