Forum: Mikrocontroller und Digitale Elektronik Bitte um Codebewertung/ µ-Controller Neuling


von Dominik T. (locaded)


Lesenswert?

Erstmal Hallo an alle Forenuser,

ich habe angefangen mich mit µ-Controllern zu beschäftigen und freue 
mich nun , mich mit euch hier in diesem Forum austauschen zu können.

Ich habe ein kleines µ-Controller Programm zum testen geschrieben, und 
würde euch nun bitten es kurz zu bewerten, auf Funktion zu prüfen und 
Verbesserungsvorschläge zu geben, bevor ich es auf den Controller 
überspiele.

Ich möchte gernen einen Attiny 2313 verwenden, mit einem externen 8MHZ 
Kristall.
Das Programm soll die Serielle Schnittstelle regelmäßig in einer 
Schleife  auslesen und bei
dem anliegenden Datensignal "1" im Uart Data Register, Ausgänge 
verzögert setzten.

1
 
2
3
//This File check the Seriell Reciever Input and switch corresponding   
4
//Outputs        
5
6
#include <avr/io.h> 
7
#define F_CPU 8000000UL
8
#include <util/delay.h> 
9
#include <avr/interrupt.h> 
10
11
12
void init_ports(void); 
13
void init_USART(unsigned int ubrr_value); 
14
void Aus_Ein_Next(); 
15
16
17
/////////////////////////////////////////////////////////////////////////////////////
18
19
int main(void) 
20
{ 
21
// Initialisation Ports, seriell Transmission, Interrupts
22
   init_ports(); 
23
    
24
   init_USART(51);//8M/(16*9600)-1 
25
   //sei();//Global Interrupt Enable 
26
/////////////////////////////////////////////////////////////////////////////////////
27
//Check UDR DATA and select Programm 
28
    while(1) 
29
    { 
30
      if ( UDR == 1) 
31
      Aus_Ein_Next() 
32
                
33
    } 
34
} 
35
36
/////////////////////////////////////////////////////////////////////////////////////
37
void init_ports(void) 
38
{ 
39
//Port D pins 1 to 3 Config as Digital Out 
40
41
   DDRD=(1<<DDD4)|(1<<DDD5)|(1<<DDD6); 
42
} 
43
/////////////////////////////////////////////////////////////////////////////////////
44
void init_USART(unsigned int ubrr_value) 
45
{ 
46
   //Set Baud rate 
47
   UBRRL = (unsigned char) ubrr_value;
48
   UBRRH = (unsigned char) (ubrr_value>>8);
49
50
   /*Set Frame Format 
51
   >> Asynchronous mode 
52
   >> No Parity 
53
   >> char size 8 
54
   */ 
55
56
   UCSRC=3<<UCSZ0; // contains UCSZ1,too ( leftshift of 3 not 1)
57
58
59
   //Enable The receiver, transmitter and interrupt 
60
   UCSRB=(1<<RXEN)|(1<<TXEN); //(1 << RXCIE) for interrupts (sreg 1 rxc, in ucsra 1)
61
} 
62
/////////////////////////////////////////////////////////////////////////////////////
63
void Aus_Ein_Next()
64
{ 
65
66
PORTD = 1<< PB4 ; //   PB4 -->  AUS
67
_delay_ms(2000);
68
PORTD = 1<< PB5 ; //    PB5 --> EIN
69
_delay_ms(2000);
70
PORTD = 1<< PB6 ; //    PB6 --> NEXT
71
}


Ich freue mich auf Eure Antworten!

MfG Domi

von Piefke (Gast)


Lesenswert?

Dominik Tews schrieb:
> bevor ich es auf den Controller
> überspiele.

Was hindert dich, das Programm selber zu testen?

> Ich freue mich auf Eure Antworten!

Mal sehen, wann sich das ändert.

von Peter II (Gast)


Lesenswert?

man sollte vorher abfragen ob auch neue Daten anliegen

if ( UDR == 1)

und nicht einfach auslesen, gehen tut das schon aber sauber ist es 
nicht.

von Werner (Gast)


Lesenswert?

Mit deinen endlosen Delays in Aus_Ein_Next() verbaust du dir einiges. 
Interruptgesteuerter Empfang der seriellen Daten wäre deutlich 
zukunftsorientierter (und der nächste Schritt, wenn das Polling 
funktioniert)

Dominik Tews schrieb:
> ... bevor ich es auf den Controller überspiele.

Das tut nicht weh und kostet nix. Aber spätestens, wenn es dort nicht 
funktioniert, ist es an der Zeit, sich den Ablauf Schritt für Schritt im 
Simulator anzusehen.

von Ingo (Gast)


Lesenswert?

Deine Formatierung ist schlecht, mal mit und mal ozne Leerzeichen. 
Versuchs einheitlich

von Dominik T. (locaded)


Lesenswert?

Danke für die schnellen Antworten. Werde versuchen, Eure Vorschläge 
umzusetzen.

@Piefke, leider ist meine bestellte Hardware noch nicht da.
         Und ich hoffe mal ich freu mich immer auf Eure antworten.


@Peter II, ich hab leider keine Programmierausbildung, weshalb mein 
Programmierstil bestimmt nicht der beste ist.
Ich bin aber gerne bereit mich verbessern zu lassen :) .
Als nächstes versuch ich also raus zu finden, wie ich abfragen kann, ob 
neue Daten anliegen.

@Werner, ja an Interrupts habe ich auch schon gedacht, mich aber 
irgendwie noch nicht ran getraut.

@Ingo, oh ja, da hast du Recht! Ordnung ist wichtig. Werde ich gleich 
verbessern.
Update: hab gerade bemerkt, das es schon zu spät ist, den ersten Beitrag 
zu editieren. Die schlechte Formatierung bleibt also zumindest in diesem 
Beitrag schlecht. Aber in meinem Programm wurde die Formatierung bereits 
verbessert.


MfG Domi

von Piefke (Gast)


Lesenswert?

Dominik Tews schrieb:
> @Piefke, leider ist meine bestellte Hardware noch nicht da.

Dann warte ab, bis sie da ist.
Programmierprobleme lassen sich nicht virtuell lösen. Gerade als 
Anfänger muß man Schritt für Schritt vorgehen und nach jedem Schritt neu 
testen.

Da du noch keine Hardware hast, hast du sicherlich auch noch keine LED 
zum Blinken gebracht.Fange damit an!
Und zwar das Programm selber zu schreiben und nicht zu sehen, dass bei 
anderen Leuten das alles so einfach aussieht.
Zum Schwimmernlernen braucht man auch Wasser und kein Video, wie Andere 
das machen.

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.