Forum: Mikrocontroller und Digitale Elektronik LED Matrix steuern mit RN-Control 1.4 (atmega32)


von Céd G. (kampfsoletti)


Lesenswert?

hallo zusammen...

jetzt häng ich hier schon mindestens 10 stunden drin und such eine 
lösung für mein problem doch find ich keine :/ ich hab' zwar schon einen 
gefunden der ein ähnliches problem hatte, half mir aber nicht wirklich 
weiter...

mein ziel ist es eine 5x10 led matrix anzusteuern, einfarbig ganz schnöd 
und normal :) .. hab sie schon gebaut verkabelt und an das RN-Control 
v1.4 angesteckt .. hab mich in verschiedene themen eingearbeitet wie zb. 
Uart und wie das da funktioniert, hab mir das was ich brauche 
zusammengebastelt, auch mit hilfe von diesem forum, doch komm ich jetzt 
einfach nicht drauf warum das ding nicht funktionieren will...


also ich habe eine zeilenfolge von [E][x][y][#] wobei die raute als 
stopbit fungiert...und ich will jetzt je nachdem was sich in dem 
empfangenen string befindet die led die für die 2 koordinaten steht zum 
leuchten bringen...

wär toll wenn sich das vll der eine oder andere zu gemüte führt... kann 
nicht garantiern dasses nicht totaler krampf ist... so hoffe ich bei 
eurem urteil auf milde ..
1
#define F_CPU 16000000L            
2
// "Morsedauer" für ein Bit in Millisekunden
3
#define BITZEIT 100     
4
 
5
#include <string.h>
6
#include <avr/io.h>
7
#include <avr/interrupt.h>
8
#include <util/delay.h>
9
10
11
// Baudrate, das L am Ende ist wichtig, NICHT UL verwenden!
12
#define BAUD 9600L          
13
 
14
// Berechnungen
15
// clever runden
16
#define UBRR_VAL  ((F_CPU+BAUD*8)/(BAUD*16)-1)  
17
// Reale Baudrate
18
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     
19
// Fehler in Promille 
20
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000) 
21
 
22
#if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))
23
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
24
#endif
25
 
26
// globale Variablen für den UART
27
 
28
// Puffergrösse in Bytes, RX und TX sind gleich gross
29
#define uart_buffer_size 32             
30
 
31
volatile uint8_t uart_rx_flag=0;            // Flag, String komplett empfangen
32
volatile uint8_t uart_tx_flag=1;            // Flag, String komplett gesendet
33
char uart_rx_buffer[uart_buffer_size];      // Empfangspuffer
34
char uart_tx_buffer[uart_buffer_size];      // Sendepuffer
35
 
36
// lange, variable Wartezeit, Einheit in Millisekunden
37
void long_delay(uint16_t ms) {
38
    for (; ms>0; ms--) _delay_ms(1);
39
}
40
 
41
// einen String senden
42
// vor Aufruf der Funktion muss man prüfen, ob uart_t_flag==1 ist
43
// nur dann kann ein neuer String gesendet werden
44
 
45
void put_string(char *daten) {
46
 
47
   if (uart_tx_flag==1) {
48
      // String daten in den Sendepuffer kopieren
49
      strcpy(uart_tx_buffer, daten);      
50
      // Flag für 'Senden ist komplett' löschen, 
51
      uart_tx_flag = 0;                    
52
      // UDRE Interrupt einschalten, los gehts
53
      UCSRB |= (1<<UDRIE); 
54
   }
55
}
56
57
// einen empfangenen String kopieren
58
// vor Aufruf der Funktion muss man prüfen, ob uart_rx_flag==1 ist
59
// anderenfalls ist der RX Buffer noch ungültig
60
 
61
void get_string(char *daten) {
62
 
63
   if (uart_rx_flag==1)
64
   {
65
      // String kopieren
66
      strcpy(daten, uart_rx_buffer);      
67
      // Flag löschen
68
      uart_rx_flag = 0;                    
69
   }
70
}
71
 
72
73
// Hauptprogramm
74
 
75
int main (void) {
76
77
78
79
    char stringbuffer[64];  // Allgemeiner Puffer für Strings
80
    uint8_t buffer_full=0;  // noch ein Flag, aber nur in der Hauptschleife
81
//    char * charpointer;     // Hilfszeiger
82
    
83
// IO konfigurieren
84
 
85
    DDRA = 0xFF;
86
    DDRB = 0xFF;
87
    DDRC = 0xFF;
88
    DDRD = 0xFF;
89
90
  PORTB = 0xff;
91
  PORTD = 0xff;
92
  PORTA = 0xff;
93
  
94
 
95
// UART konfigurieren
96
 
97
    UBRRH = UBRR_VAL >> 8;
98
    UBRRL = UBRR_VAL & 0xFF;
99
    UCSRB = (1<<RXCIE) | (1<<RXEN) | (1<<TXEN); 
100
  UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //8N1 8 bit parity none 1 stopbit 
101
//  UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0) | (0 << UPM1);
102
//  UCSRC = (1<<URSEL)|(3<<UCSZ0);
103
//  UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0); 
104
105
   
106
// Stringpuffer initialisieren
107
108
 
109
    stringbuffer[0] = '\n';
110
    stringbuffer[1] = '\r';
111
 
112
113
114
//variablen
115
int x;
116
int y;
117
// Interrupts freigeben
118
 
119
    sei();
120
121
// Endlose Hauptschleife
122
123
    while(1) 
124
  {
125
126
 
127
        // Wurde ein kompletter String empfangen 
128
        // und der Buffer ist leer?
129
        if (uart_rx_flag==1 && buffer_full==0)
130
    {    
131
            // ja, dann String lesen, 
132
            get_string(stringbuffer);             
133
            buffer_full=1;
134
    
135
      x = stringbuffer[1];
136
      y = stringbuffer[2];
137
      
138
139
    
140
  if(stringbuffer[0] == 'E'|| stringbuffer[0] == 'e')
141
      {    
142
        x = stringbuffer[1];
143
        y= stringbuffer [2];
144
      
145
        if(stringbuffer[1]<7)
146
        {
147
          PORTB |= (1 << x);
148
          PORTA &= ~(1 << y);
149
        }
150
151
        else
152
        {  if(stringbuffer[1]>=7)
153
          {
154
            PORTD |= (1 << x);
155
            PORTA &= ~(1 << y);
156
          }
157
        
158
        }
159
      }  
160
      
161
  else
162
  {    
163
164
            
165
    if(stringbuffer[0] == 'A'|| stringbuffer[0] == 'a')
166
        {    
167
          x = stringbuffer[1];
168
          y = stringbuffer[2];
169
170
          if(stringbuffer[1]<7)
171
          {
172
            PORTB &= ~(1 << x);
173
            PORTA |= (1 << y);
174
          }
175
176
          else
177
          {  if(stringbuffer[1]>=7)
178
            {
179
              PORTD &= ~(1 << x);
180
              PORTA |= (1 << y);
181
            }
182
          }
183
         }
184
185
186
187
  }
188
      
189
    
190
    
191
    
192
    
193
    
194
      }

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.