Erweiterung mit UART

Gast #2883882
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.
Gast #2883885
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.
Gast #2883887
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.
#2883891
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?
Gast #2883911
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

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