Forum: Mikrocontroller und Digitale Elektronik CodeVisionAVR Rx ISR


von Klaus (Gast)


Lesenswert?

Hallo,

ich nutze die aktuelle Eval. Version von CodeVision. Leider ist im 
Wizard die Möglichkeit einen Empfangsinterrupt beim USART zu nutzen in 
der Testversion nicht möglich. Kann mir jemand sagen, ob diese Option 
nur im Wizard nicht zur Verfügung steht, oder grundsätzlich nicht? 
Könnte man den Code für die ISR einfügen und in der initialisierung der 
USART händisch, per Register, den Rx Interupt einschalten?

Klaus

von H.Joachim S. (crazyhorse)


Lesenswert?

Klar kannste das machen.

von H.Joachim S. (crazyhorse)


Lesenswert?

1
#include <mega88.h>
2
3
//8MHz
4
// Declare your global variables here
5
6
#define DATA_REGISTER_EMPTY (1<<UDRE0)
7
#define RX_COMPLETE (1<<RXC0)
8
#define FRAMING_ERROR (1<<FE0)
9
#define PARITY_ERROR (1<<UPE0)
10
#define DATA_OVERRUN (1<<DOR0)
11
12
// USART Receiver buffer
13
#define RX_BUFFER_SIZE0 8
14
char rx_buffer0[RX_BUFFER_SIZE0];
15
16
#if RX_BUFFER_SIZE0 <= 256
17
unsigned char rx_wr_index0=0,rx_rd_index0=0;
18
#else
19
unsigned int rx_wr_index0=0,rx_rd_index0=0;
20
#endif
21
22
#if RX_BUFFER_SIZE0 < 256
23
unsigned char rx_counter0=0;
24
#else
25
unsigned int rx_counter0=0;
26
#endif
27
28
// This flag is set on USART Receiver buffer overflow
29
bit rx_buffer_overflow0;
30
31
// USART Receiver interrupt service routine
32
interrupt [USART_RXC] void usart_rx_isr(void)
33
{
34
char status,data;
35
status=UCSR0A;
36
data=UDR0;
37
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
38
   {
39
   rx_buffer0[rx_wr_index0++]=data;
40
#if RX_BUFFER_SIZE0 == 256
41
   // special case for receiver buffer size=256
42
   if (++rx_counter0 == 0) rx_buffer_overflow0=1;
43
#else
44
   if (rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0=0;
45
   if (++rx_counter0 == RX_BUFFER_SIZE0)
46
      {
47
      rx_counter0=0;
48
      rx_buffer_overflow0=1;
49
      }
50
#endif
51
   }
52
}
53
54
#ifndef _DEBUG_TERMINAL_IO_
55
// Get a character from the USART Receiver buffer
56
#define _ALTERNATE_GETCHAR_
57
#pragma used+
58
char getchar(void)
59
{
60
char data;
61
while (rx_counter0==0);
62
data=rx_buffer0[rx_rd_index0++];
63
#if RX_BUFFER_SIZE0 != 256
64
if (rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0;
65
#endif
66
#asm("cli")
67
--rx_counter0;
68
#asm("sei")
69
return data;
70
}
71
#pragma used-
72
#endif
73
74
// Standard Input/Output functions
75
#include <stdio.h>
76
77
void main(void)
78
{
79
// Declare your local variables here
80
81
// Crystal Oscillator division factor: 1
82
#pragma optsize-
83
CLKPR=(1<<CLKPCE);
84
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
85
#ifdef _OPTIMIZE_SIZE_
86
#pragma optsize+
87
#endif
88
89
// Input/Output Ports initialization
90
// Port B initialization
91
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
92
DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
93
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
94
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
95
96
// Port C initialization
97
// Function: Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
98
DDRC=(0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);
99
// State: Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
100
PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);
101
102
// Port D initialization
103
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
104
DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
105
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
106
PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);
107
108
// USART initialization
109
// Communication Parameters: 8 Data, 1 Stop, No Parity
110
// USART Receiver: On
111
// USART Transmitter: Off
112
// USART0 Mode: Asynchronous
113
// USART Baud Rate: 9600
114
UCSR0A=(0<<RXC0) | (0<<TXC0) | (0<<UDRE0) | (0<<FE0) | (0<<DOR0) | (0<<UPE0) | (0<<U2X0) | (0<<MPCM0);
115
UCSR0B=(1<<RXCIE0) | (0<<TXCIE0) | (0<<UDRIE0) | (1<<RXEN0) | (0<<TXEN0) | (0<<UCSZ02) | (0<<RXB80) | (0<<TXB80);
116
UCSR0C=(0<<UMSEL01) | (0<<UMSEL00) | (0<<UPM01) | (0<<UPM00) | (0<<USBS0) | (1<<UCSZ01) | (1<<UCSZ00) | (0<<UCPOL0);
117
UBRR0H=0x00;
118
UBRR0L=0x33;
119
120
// Global enable interrupts
121
#asm("sei")
122
123
while (1)
124
      {
125
      // Place your code here
126
127
      }
128
}

-----------

Mit den [ c ] / [ / c ] - Tags wird das ein bisschen lesbarer.

-rufus

: Bearbeitet durch User
von H.Joachim S. (crazyhorse)


Lesenswert?

Danke, ich habs nur rein kopiert.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Nachtrag:

Der Code ist grässlich formatiert. Einrückungen verwenden!
1
DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);

Was ergibt das Herumschieben von Nullen? Genau: Null.

Also könntest Du das Klammer-und-Schiebeoperator-Gewölle auf ein 
wesentlich klareres
1
DDRB = 0;

reduzieren.

von H.Joachim S. (crazyhorse)


Lesenswert?

Sicher, aber das ist nun mal der output vom Code-Wizard :-)
Hatte jetzt keine Lust, das nochmal zu überarbeiten.

von Stephan K. (nightowl)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Der Code ist grässlich formatiert. Einrückungen verwenden!

Na ja, in diesem Fall schon.

Zum einen denke ich aber daß der Codewizard die Zeile erzeugt hat, und 
zum anderen ist es so übersichtlicher welcher PIN In Out oder Tristate 
gesetzt wird.

von Klaus (Gast)


Lesenswert?

@crazyhorse

cool, Danke. Und sogar auch noch für den richtigen Controller :-)

Gruß
Klaus

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.