Hallo,
ich habe ein Problem mit dem Uart, auf dem PC etwas empfangen kann ich
zwar, jedoch scheint beim AVR auf dem Pollin-Evaluations-Board nichts
anzukommen.
Wenn ich TX an RX halte, empfange ich jedes Zeichen wieder. Theoretisch
müsste alles funktionieren.
Wenn ich jedoch eine Drahtbrücke auf der IC-Fassung einsetze, empfange
ich nicht jedes Zeichen doppelt. Desweiteren kann ich nur etwas
empfangen, wenn ich einen Programmer in die ISP-Buchse eingesteckt habe.
1
#define F_CPU 16000000UL
2
#define BAUD 9600UL
3
#define UBRR_BAUD ((F_CPU)/(BAUD*16UL))-1
4
5
#include<avr/io.h>
6
#include<util/delay.h>
7
#include<stdlib.h>
8
#include<avr/interrupt.h>
9
10
11
12
voidinit_uart(void)
13
{
14
// Baudrate einstellen
15
UBRRH=(uint8_t)(UBRR_BAUD>>8);
16
UBRRL=(uint8_t)(UBRR_BAUD);
17
// Aktivieren von receiver und transmitter
18
UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
19
20
// Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
21
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
22
}
23
24
25
26
27
intuart_putc(unsignedcharc)
28
{
29
while(!(UCSRA&(1<<UDRE)))/* warten bis Senden moeglich */
30
{
31
}
32
33
UDR=c;/* sende Zeichen */
34
35
return0;
36
}
37
38
39
/* puts ist unabhaengig vom Controllertyp */
40
41
voiduart_puts(char*s)
42
{
43
while(*s)
44
{/* so lange *s != '\0' also ungleich dem "String-Endezeichen(Terminator)" */
45
uart_putc(*s);
46
s++;
47
}
48
}
49
50
uint8_tuart_getc(void)
51
{
52
while(!(UCSRA&(1<<RXC)))// warten bis Zeichen verfuegbar
53
;
54
returnUDR;// Zeichen aus UDR an Aufrufer zurueckgeben
55
}
56
57
58
59
intmain(void)
60
{
61
sei();
62
//DDRD|=(1<<PD7);
63
init_uart();
64
uart_puts("Bereit....");
65
uint8_tc=uart_getc();
66
uart_puts("Etwas Empfangen!");
67
return0;
68
}
Der Code ist zu 90% aus dem Tutorial. Das Problem ist nun, dass ich
niemals "Etwas Empfangen!" empfange.
Ich habe noch vergessen zu erwähnen, dass ich hiermit:
> Desweiteren kann ich nur etwas> empfangen, wenn ich einen Programmer in die ISP-Buchse eingesteckt habe.
das "Bereit" meine.
das "Etwas Empfangen" erhielt ich noch nie.
Stefan Ernst schrieb:> UCSRB = ... (1<<RXCIE);+ keine ISR (sondern Polling) => kein Empfangen möglich
Das heißt RXCIE muss ich nicht setzen , kann ich aber?
Anonym schrieb:> Ich habe noch vergessen zu erwähnen, dass ich hiermit:>> Desweiteren kann ich nur etwas>> empfangen, wenn ich einen Programmer in die ISP-Buchse eingesteckt habe.>> das "Bereit" meine.>> das "Etwas Empfangen" erhielt ich noch nie.>> Stefan Ernst schrieb:>> UCSRB = ... (1<<RXCIE);+ keine ISR (sondern Polling) => kein Empfangen möglich>> Das heißt RXCIE muss ich nicht setzen , kann ich aber?
RXCIE: Receive complete interrupt enable.
Wenn du keine Interrupt Routine dafür bereitstellst, dann gibt es unter
Umständen nach einem empfangenen Zeichen sofort einen Reset.
Anonym schrieb:> #define F_CPU 16000000UL
Sind die Fuses auch entsprechend eingestellt?
Und natürlich: sind Quarz bzw. Takt vorhanden, d.h. µC läuft "im
Prinzip"? -> Test mit LED
Gruß Dietrich
In Deinem Programm fehlt die Endlosschleife. main() wird einmal
durchlaufen und dann ist Schluß.
Gruß Carsten...
PS: hab gerade gesehen in uart_getc(void) ist eine Warteschleife.
Das funktioniert aber dann auch nur ein Mal.
Dietrich L. schrieb:> Anonym schrieb:>> #define F_CPU 16000000UL>> Sind die Fuses auch entsprechend eingestellt?> Und natürlich: sind Quarz bzw. Takt vorhanden, d.h. µC läuft "im> Prinzip"? -> Test mit LED>> Gruß Dietrich
Ich bekomme immer ein "Bereit" vom µC, sobald er startet bzw. resettet
wird.
Fuses sind wohl auch richtig eingestellt.
Low:0xef
High:0xd9
Carsten H. schrieb:> Ist denn der Jumper JP1 gesteckt auf dem Board? Sonst ist die RX-Leitung> nicht zum Prozessor durchgeschaltet.
JP1 und JP2 sind gesteckt
Hubert G. schrieb:> Bei mir funktioniert es, muss wohl doch ein HW-Fehler sein.
Hmm... Okay. Vielen Dank.
Hubert G. schrieb:> Es liegt nur am |(1<<RXCIE) das nicht hingehört.> Schau mal ob du das richtige File ladest.> Ein HW-Fehler ist natürlich immer noch möglich.
Ne das passt alles.
Was ich noch sonderbar finde ist halt, dass ich nur Empfange wenn der
ISP-Programmer eingesteckt ist.
Carsten H. schrieb:> Ziehst Du den Programmer komplett vom Board ab oder nur das USB-Kabel> vom Programmer?
Macht keinen Unterschied, sobald USB-Kabel einzeln oder der Programmer
komplett entfernt ist , empfange ich nichts mehr
Das klingt irgendwie nach einem Problem mit der Reset-Leitung.
Ein stromloser Programmer könnte die Reset-Leitung über seine
Clamp-Dioden runter ziehen, aber wenn der Programmer vom Board ab ist
und es trotzdem nicht geht, könnte es ein Problem auf dem Board sein.
Welche Spannung liegt denn am Reset-Pin, wenn der Programmer ab ist?
Hubert G. schrieb:> Dann fehlt dir die GND-Verbindung vom Board zum PC.> Das das ganze nur einmal funktioniert ist schon klar?
Das kann gut sein, da der COM-Port bei meinem Mainboard ein
Pfostenstecker war und ich mir so selbst einen Adapter zu D-Sub bauen,
musste, ich schaue direkt nach ob ich vielleicht etwas vergessen habe.
Vielen Dank schon mal!
Hab mich wohl zu früh gefreut, es läuft leider immer noch nicht richtig.
Die GND-Leitung musste ich zwar nachbessern, es hat aber leider nichts
verändert.
Ich glaube ich bin der Lösung schon näher gekommen, vielleicht gibt es
jetzt noch ein paar Ideen um die Sache abzuschließen.
Also ich habe den Code wie folgt abgeändert:
Ich glaube ich bin der Lösung schon näher gekommen, vielleicht gibt es
jetzt noch ein paar Ideen um die Sache abzuschließen.
Also ich habe den Code wie folgt abgeändert:
int main(void)
{
init_uart();
uart_puts("Bereit....");
while(1)
{
if(UDR!=0)
uart_putc(UDR);
}
return 0;
}
Nun sieht es so aus:
µC:"Bereit....
Eingabe: (Beispielsweise:)"k")
µC:"kkkkkkkkk,usw......"
Ps: Sorry für den Doppelpost