Mal ne dumme Frage.

Gast #1970600
Lesenswert?

Hallo,

ich benutze aktuell den Atmega 644 und bin in C gleich einmal daran 
gescheitert die Signale an Port A auszugeben.
Setze ich nämlich mit
1
 PORTA=255
 leuchten alle LEDs wies sein soll, blöd ist nur ich krieg sie nichtmehr 
aus. Jede direkte Zuweisung scheint final zu sein. Das einzigste was 
funktioniert ist die Zuweisung über ein ExOr nur das setzt voraus das 
ich davor alle LEDs nochmal auf 0 gesetzt habe, ist also nicht wirklich 
praktikabel. Was mach ich falsch??

Hier der code benutze die UART bib von peter fleury läuft 1a:
1
 
2
#include <avr/io.h>
3
#include <util/delay.h> // für _delay_ms(zeit);
4
#include <stdlib.h>
5
#include <avr/interrupt.h>
6
#include <avr/signal.h>
7
#include <avr/pgmspace.h>
8

9
#include "uart.h"
10

11
#define UART_BAUD_RATE 57600
12

13
int main(void)
14
{
15
  uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
16
  sei();
17

18
        DDRA = 0xFF;
19

20

21
        unsigned int empfangen=0;
22

23
  while(1==1){
24

25

26
    empfangen=uart_getc();
27

28

29
    if(empfangen==1){
30
                  PORTA = 0b00000001;
31
    }
32
    if(empfangen==2){
33
                  PORTA =  0b00000010;
34
    }
35
    if(empfangen==3){
36
                  PORTA = 0b00000100;
37
    }
38
    if(empfangen==4){
39
                  PORTA = 0b00001000;
40
    }
41
    if(empfangen==5){
42
                  PORTA = 0;
43
    }
44

45

46
  }
47

48
}
Persönliche Seite #1970610
Lesenswert?

Was liefert uart_getc? Doch sicherlich das von Dir über die serielle 
Schnittstelle an den µC gesendete Zeichen.

Wenn Du das aber auswerten willst, dann musst Du dessen ASCII-Code 
oder eben das Zeichen auswerten.

Du aber vergleichst dieses Zeichen mit den numerischen Werten 1 bis 5 
- das sind die ASCII-Codes von Steuerzeichen, die Du im Terminalprogramm 
nur umständlich durch Drücken von CTRL+A bis CTRL+E eingeben kannst.

Ändere das und vergleiche empfangen mit den Konstanten '1' bis '5'. 
Das sind Zeichen.
#1970622
Lesenswert?

EAGLE schrieb:

> Setze ich nämlich mit
1
 PORTA=255
 leuchten alle LEDs wies sein
> soll, blöd ist nur ich krieg sie nichtmehr aus. Jede direkte Zuweisung
> scheint final zu sein.

Un dfür die Zukunft:
Beim Testen testet man immer die einfachste Variante.
In deinem Code fallen mir auf Anhieb 3 andere Dinge ein, die genausogut 
schief gehen können und die absolut nichts mit den Ports an sich, und 
dass eine Zuweisung 'final' wäre, zu tun haben.

Wie willst du unterscheiden, welcher dieser mindestens 3 möglichen 
Fehler vorliegt, wenn du nicht systematisch vorgehst?
Gast #1970684
Lesenswert?

@Karl heinz Buchegger

ja ich habs auch schon simpler gemacht:
1
while(1==1){
2

3
    empfangen=uart_getc();
4

5
     PORTA = empfangen;
6

7
}

mit dem Ergebnis das der erste genommene wert (also 0) final an die 
Ports ausgegeben wird.

d.h hier würden LEDs beispielsweise ewig leuchten:
1
    PORTA=255;
2

3
while(1==1){
4

5
    PORTA=0;
6

7
}
Gast #1970752
Lesenswert?

Du schreibst, die Leds "würden" ewig leuchten in deinem letzten 
Beispiel. Heißt das jetzt, dass du das getestet hast, mit exakt dem 
Beispiel? Oder nimmst du das einfach nur grad mal so an?

Also falls sich das mit deinem einfachen Beispiel, ausschlieslich 
bestehend aus DDR-Initialisierung, Port schreiben, Schleife und darin 
wieder Port schreiben so verhält, dass die Leds an bleiben ist was 
ernsthaft faul. Das sollte so nicht sein. Falls dem so ist brauchen wir 
alle Infos zum Aufbau. Was für ein Controller auf was für einem Board, 
Schaltplan, Foto und/oder Layout von der Platine. Auch Compiler und 
dessen Einstellungen.
Gast #1970761
Lesenswert?

Ich kenne jetzt die UART Bibliothek nicht, aber ich vermute, dass

while(1==1){

    empfangen=uart_getc();

     PORTA = empfangen;

}

immer 0 liefert. Nur wenn ein Zeichen kommt, wird das ganz kurz am Port 
"angezeigt". Danach kommt sofort wieder der IDLE Wert 0 zum tragen! Das 
heißt, für dich siehts immer nach ner 0 aus.

Wie gesagt, nur eine Vermutung.
Gast #1970768
Lesenswert?

Mir ist da grad noch was aufgefallen. Es sieht so aus als würdest du die 
UART Library von Peter Fleury verwenden. Bei dieser Bibliothek kannst du 
aber nicht blind die empfangen Daten per uart_getc() abrufen.

Die Funktion uart_getc() wartet nicht auf Daten vom UART. Der Aufruf 
kommt sofort zurück, das Ergebnis ist ein 16bit-Wert. In den oberen acht 
Bit wird mit Flags signalisiert, was von den unteren acht Bit zu halten 
ist. Das wird bei dir in den meisten Fällen das Flag für "es gibt keine 
Daten aus dem UART-Puffer abzuholen" sein. Was da dann genau mit den 
unteren acht Bit ist, kann ich dir nicht sagen, aber gültige Daten 
müssen das auf keinen Fall sein, wenn dir die Flags das nicht eben auch 
signalisieren.
Gast #1970773
Lesenswert?

@ Felix
in Peter Fleurys beispiel uart_text.c steht dazu:
1
for(;;)
2
    {
3
        /*
4
         * Get received character from ringbuffer
5
         * uart_getc() returns in the lower byte the received character and 
6
         * in the higher byte (bitmask) the last receive error
7
         * UART_NO_DATA is returned when no data is available.
8
         *
9
         */
10
        c = uart_getc();
11
        if ( c & UART_NO_DATA )
12
        {
13
            /* 
14
             * no data available from UART 
15
             */
16
        }
17
        else
18
        {
19
            /*
20
             * new data available from UART
21
             * check for Frame or Overrun error
22
             */
23
            if ( c & UART_FRAME_ERROR )
24
            {
25
                /* Framing Error detected, i.e no stop bit detected */
26
                uart_puts_P("UART Frame Error: ");
27
            }
28
            if ( c & UART_OVERRUN_ERROR )
29
            {
30
                /* 
31
                 * Overrun, a character already present in the UART UDR register was 
32
                 * not read by the interrupt handler before the next character arrived,
33
                 * one or more received characters have been dropped
34
                 */
35
                uart_puts_P("UART Overrun Error: ");
36
            }
37
            if ( c & UART_BUFFER_OVERFLOW )
38
            {
39
                /* 
40
                 * We are not reading the receive buffer fast enough,
41
                 * one or more received character have been dropped 
42
                 */
43
                uart_puts_P("Buffer overflow error: ");
44
            }
45
            /* 
46
             * send received character back
47
             */
48
            uart_putc( (unsigned char)c );
49
        }
50
    }
Gast #1970792
Lesenswert?

Naja, das ist ja genau das was ich meine. Du kannst nicht einfach 
uart_getc() aufrufen und hoffen das da immer Daten vom UART 
zurückgegeben werden.  Du musst schon noch wie im Beispiel die Flags 
prüfen. Bei den meisten Aufrufen wird dir uart_getc() eben das 
UART_NO_DATA-Flag zurückgeben und du weißt damit, dass eben keine Daten 
empfangen wurden, sprich der Empfangspuffer leer ist.
In den Fall solltest du aber auch nicht die unteren acht Bit des 
Rückgabewertes verwenden und irgendwo zuweisen, da das keine gültigen 
Daten vom UART sein müssen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren