Forum: Mikrocontroller und Digitale Elektronik Erweiterung mit UART


von Anfänger (Gast)


Lesenswert?

Hi, nacheem Ihr mir so viel bereits geholfen habt, um mein ersten 
Versuch mit dem Atmega88 in Gang zu setzen, habe ich noch eine kleine 
Frage.
1
/* define CPU frequency in Mhz here if not defined in Makefile */
2
#ifndef F_CPU
3
#define F_CPU 1000000UL
4
#endif
5
6
#include <stdlib.h>
7
#include <avr/io.h>
8
#include <avr/interrupt.h>
9
#include <avr/pgmspace.h>
10
#include <util/delay.h>
11
#include <stdio.h>
12
#include "uart.h"
13
14
15
16
17
/* 9600 baud */
18
#define UART_BAUD_RATE      9600
19
20
void Schalter1 (void)
21
{
22
23
  PORTC &= ~(1<<PORTC0); // Bit 0 loeschen, LED an
24
  _delay_ms(2000);
25
  PORTC |= (1 << PORTC0);  // Bit 0 setzen, LED aus
26
  uart_putc ('1');
27
} // Ende Funktion Schalter1
28
29
void Schalter2 (void)
30
{
31
  PORTC &= ~(1<<PORTC1); // Bit 0 loeschen, LED an
32
  _delay_ms(2000);
33
  PORTC |= (1 << PORTC1);  // Bit 0 setzen, LED aus} 
34
} // Ende Funktion Schalter2
35
36
37
int main(void)
38
{
39
  // eigene Variablen
40
    
41
  // Baudrate einstellen und BITS in UBBR setzen
42
  uart_init (UART_BAUD_SELECT (UART_BAUD_RATE, F_CPU));
43
  
44
  // Datenrichtung festsetzen
45
  DDRB = 0x00;  // alles Eingänge
46
  PORTB = 0xFF; // alle PullUps einschalten
47
  
48
  DDRC = 0x3F;  // Pin 0-5 Ausgänge!
49
  
50
  // Interrupts einschalten
51
  sei ();
52
  
53
  PORTC = 0xFF;  // alle LEDs aus
54
    
55
  while (1)
56
  {
57
    if ( !(PINB & (1<<PINB0)) ) 
58
    {
59
      Schalter1();
60
    }
61
    
62
    if ( !(PINB & (1<<PINB1)) )
63
    {
64
      Schalter2();
65
    }    
66
  } // Ende while
67
} // end of main

Dies ist ein kleines Programm, was nun ganz gut läuft mit der Korrektur 
der if-Abfrage. Ich habe an einer Stelle einen weiteren Befehl eingefügt

  uart_putc ('1');

Jetzt soll der Atmega88 nach dem Abschalten der Lampe ein Zeichen über 
den UART senden.

Meine Frage - kann ich einfach am TXD-Pin des Atmega88 ein Oszi 
anschließen und gegen Masse messen? Ich müsste doch dann im Oszi 
irgendwie sowas erkennen können


......****..*****.......***...******......**...*****......

ein wie auch immer geartetes Hoch- und Tief zwischen Low/High, abhängig 
halt vom ASCII-Zeichen. Aber ich kann mit dem Oszi nix messen.

Leider hab ich an meinem PC noch keine serielle Schnittstelle, so einen 
USB-Adapter hab ich mir zwar bestellt, der ist aber noch nicht da, so 
dacht ich vorher, ich könnte schon mal mit dem Oszi messen, ob ein 
Signal gesendet wird.

von TestX .. (xaos)


Lesenswert?

eigentlich sollte das so funktionieren (vom prinzip her). aber was macht 
deine uart_init ? am TX pin des controllers kannst du das signal messen

von I have no idea what I am doing (Gast)


Lesenswert?

Anfänger schrieb:
> Meine Frage - kann ich einfach am TXD-Pin des Atmega88 ein Oszi
> anschließen und gegen Masse messen? Ich müsste doch dann im Oszi
> irgendwie sowas erkennen können

ja, du solltest das oszi halt auf single shot o.ä. einstellen, sonst 
wirst du wahrscheinlich wenig sehen.

Weitergehende Hilfe kann dier erst jemand geben, wenn du noch 
veröffentlichst, was sich hinter uart.h verbirgt.

von Anfänger (Gast)


Lesenswert?

Das AVR-GCC Tutorial - Unterkapitel UART - verweist auf die UART.H von 
Peter Fleury

von Anfänger (Gast)


Lesenswert?

Andi D. schrieb:
> aber was macht
> deine uart_init

die Funktion uart_init (...) berechnet wohl irgendwie anhand der 
eingestellten Baudrate und der Taktfrequenz des Mikrocontrollers einen 
Wert, um mit diesem Wert die Pulslänge der Signale einstellen zu können. 
Ist zB. die Taktfrequenz höher, dann muss der uC mehr interne Taktzyklen 
durchlaufen, als wenn er eine kleinere Taktfrequenz hätte, um auf die 
gewünschte Pulslänge des zu übertragenden Signals zu kommen. So ganz 
genau kann ich es Dir leider nicht erklären, dass kann vlt. jemand 
anders hier drinnen noch besser.

von Anfänger (Gast)


Lesenswert?

cool, jetzt auf einmal klappts. und wenn ich unterschiedliche Zeichen 
mit uart_put... mache, dann sehen die Bilder im Oszi verschieden aus.

von Karl H. (kbuchegg)


Lesenswert?

Anfänger schrieb:
> Andi D. schrieb:
>> aber was macht
>> deine uart_init
>
> die Funktion uart_init (...) berechnet wohl irgendwie anhand der
> eingestellten Baudrate und der Taktfrequenz des Mikrocontrollers einen
> Wert, um mit diesem Wert die Pulslänge der Signale einstellen zu können.
> Ist zB. die Taktfrequenz höher, dann muss der uC mehr interne Taktzyklen
> durchlaufen, als wenn er eine kleinere Taktfrequenz hätte, um auf die
> gewünschte Pulslänge des zu übertragenden Signals zu kommen. So ganz
> genau kann ich es Dir leider nicht erklären, dass kann vlt. jemand
> anders hier drinnen noch besser.

Ich bin mir fast sicher, dass Andi D. das alles weiß.
Aber: So wie alles, muss auch die UART konfiguriert werden. Da sind ein 
paar Register mit Werten zu besetzen und auch dabei kann man Fehler 
machen. Zb. den ganz banalen Fehler, dass man dem UART das Schreiben 
nicht erlaubt hat, wodurch dann auch logischerweise am Schreibpin nichts 
rauskommt.

Wenn du mit dem Oszi kontrollieren willst, dann mach das so:
1
#ifndef F_CPU
2
#define F_CPU 1000000UL
3
#endif
4
5
#include <stdlib.h>
6
#include <avr/io.h>
7
#include <avr/interrupt.h>
8
#include <avr/pgmspace.h>
9
#include <util/delay.h>
10
#include <stdio.h>
11
#include "uart.h"
12
13
14
/* 9600 baud */
15
#define UART_BAUD_RATE      9600
16
17
int main(void)
18
{
19
  uart_init (UART_BAUD_SELECT (UART_BAUD_RATE, F_CPU));
20
21
  sei ();
22
  while (1)
23
  {
24
    uart_putc ('1');
25
  } // Ende while
26
} // end of main

Damit hast du 'Dauerfeuer' an der USART und das kannst du am Oszi kaum 
übersehen. Wenn man etwas testen will, dann muss man den Test auch so 
designed, dass man mit seinem Messmitel was sieht. Oder was denkst du: 
wirst du eine paar Millisekunden lange Pulssequenz am Oszi sehen, wenn 
sich die nur alle paar Sekunden mal wiederholt?

von Werner (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Damit hast du 'Dauerfeuer' an der USART und das kannst du am Oszi kaum
> übersehen.

So ein Dauerfeuer ohne Punkt und Komma macht die Interpretation und das 
Triggern des Oszis eher schwierig. Selbst ein PC hätte da, abhängig vom 
gesendeten Zeichen, Schwierigkeiten seinen Empfänger richtig zu 
synchronisieren.

Übersichtlicher ist, nach dem Senden des Zeichens eine Pause einzubauen 
und das Oszi vernünftig zu Triggern

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.