Senden mit ATMEGA238P-PU

OP #3108327
Lesenswert?

Hallo,

ich bin bezüglich der Arbeit mit einem Mikrocontroller ein Frischling, 
möchte mich nun aber so langsam einarbeiten. Jetzt möchte ich die 
Kommunikation zwischen Mikrocontroller und PC hinbekommen.

Ich arbeite mit dem Arduino UNO Board (Mikrocontroller ATMEGA328P-PU). 
Zum Empfangen am PC nutze ich das HTerm Terminal.

Ich habe mich eigentlich auch streng an das Tutorial gehalten aber 
irgendwie will es nicht so klappen wie ich will.

Folgenden Quellcode habe ich mir überlegt.


1
#define F_CPU 12000000ul
2
#define _BAUD 9600ul //9600?
3
#define UBRR (F_CPU/(_BAUD*16))-1
4
#define UCSZ1 2
5
#define UCSZ0 1
6
#define UDRE 5
7

8

9
#include <avr/io.h>
10
#include <util/delay.h>
11
#include <inttypes.h>
12

13
void configSYS();
14

15
int main(void)
16
{
17

18
  configSYS();
19

20
  while(1){
21
    
22
       while (!(UCSR0A & (1<<UDRE)))  /* warten bis Senden moeglich                   */
23
       {
24
       }
25
       
26
       UDR0 = 'x';                    /* schreibt das Zeichen x auf die Schnittstelle */
27
  
28
      _delay_ms(1000);
29
  }
30
  
31
}
32

33
void configSYS(){
34
  UBRR0H = UBRR >> 8;          // UBRRH Register setzen
35
  UBRR0L = UBRR & 0xFF;        // UBRRL Register setzen
36
  UCSR0B |= (1<<TXEN0);        // Bit setzen zum Senden
37
  UCSR0C = (1<<UCSZ1)|(1<<UCSZ0);      // Übertragungsformat einstellen 1 Byte/keine Parität/1 Stop bit/ Asynchron
38
  
39
}


Es wäre nett wenn mir evtl. jemand auf die Sprünge helfen kann.

Viele Dank schonmal im voraus.
Gast #3108389
Lesenswert?

> Ja im Sekundentakt werden jeweils Nullen hinzugefügt.

Dann darf man davon ausgehen dass F_CPU mit der Realität in Einklang 
ist.

> Und die Warnungen verstehe ich ehrlich gesagt nicht.

Du hast Die Klammern beim Define für BAUD vergessen - hier passiert aber 
(leider) nix, weil die Operatorpräzedenzen richtig(tm) sind. Ist 
trotzdem schlechter Stil und extrem Fehleranfällig (vulgo Tretmine für 
die Zukunft).

Wenn wir schon beim schlechten Stil sind: UCSZ1, UCSZ0 und UDRE heissen 
eigentlich UCSZ01, UCSZ00 und UDRE0, dann brauchts auch dafür keine 
Defines.

Wie sehen denn die restliche Hardware und die Einstellungen an Deiner 
Seriellen aus?
Gast #3108432
Lesenswert?

> der AVR hat laut der Arduino- Website einen 16 MHz Quarz;)

Oi, das ist wahr. Und ich stelle fest: Redifinition gibt keinen error 
sondern eine warning.. Dann müssten die Nullen aber schneller kommen als 
im Sekundentakt.
Gast #3108437
Lesenswert?

> Und serielle Einstellung muss ich ehrlich sagen hab ich eig nichts
> weiter eingestellt. Du meinst nicht die Einstellungen im Terminal oder?

Ja, da sollte zweckmäßigerweise das selbe(tm) eingestellt sein wie Du am 
AVR konfiguriert hast.

Achja, wenn wir schon dabei sind: Falls Du noch den Bootloader drauf 
hast vom Arduino - der setzt afair u.a. U2X0 im UCSR0A, also ∗alle∗ 
Uart0-Register sauber initialisieren.

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