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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.