PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RS232 mit AT90CAN128 Keine Verbindung



beginner1101
27.06.2008, 11:17
Hallo mal wieder,

ich habe folgendes Problem. Ich bekomme keine Verbindung zum Hyperterminal. Ich hab am Oszi den Tx und Rx Ausgang gemessen und bekomme an einem 0 V und an dem anderen ca. 9V dauernd raus. An den Tx und Rx Ausgängen des Controllers messe ich 5 V dauernd. Ich habe im Forum leider keinen Thread gefunden, der mein Problem lösen konnte.
Zur Hardware: Ich verwende einen AT90CAN128, bei dem ich auf die TX1 und Rx1 gehe (Tx0 und Rx0 ist vom ISP belegt!). Ich programmiere in C mit dem AVRSTudio. Meine Baudrate ist 9600 und ich verwende einen Quarzoszillaotr mit einer Frequenz von 7372800 Hz.

Ich habe die Init aus dem Datenblatt übernommen, werd aber nicht wirklich schlau daraus. Ich habe meinen Code des Headerfile mal angehängt.


#include <avr/io.h>
#include <util/delay.h>


/*### Senden per USART - RS232-Kommunikation ###*/

void USART1_Init (void)
{
/* Set baud rate */
UBRR1H = 0;
UBRR1L = 47;
/* Set frame format: 8data, no parity & 2 stop bits */
UCSR1C = (0<<UMSEL1) | (0<<UPM1) | (1<<USBS1) | (3<<UCSZ1);
/* Enable receiver and transmitter */
UCSR1B = (1<<RXEN1) | (1<<TXEN1);
}


void USART1_Transmit (unsigned char data)
{
while(!(UCSR1A & (1<<UDRE1)))
{
}

UDR1 = data;
}




void uart_puts(char *s)
{
while(*s)
{
USART1_Transmit(*s);
s++;
}
}

Wäre super wenn mir jemand helfen könnte, ich bin am verzweifeln. ](*,)

LG Anna

McJenso
27.06.2008, 12:55
Hallo,

warum schreibst du nicht, was dich so sicher macht, dass der fehler in den Codeschnipseln liegt?

Wir brauchen den ganzen Code. Bzw eine minimale compilierbare Version die den Fehler zeigt.

Gruß

Jens

drew
27.06.2008, 12:58
Hallo,
ich hab gerade einen AT90CAN64 vor mir. Leider hab ich aber keine RS232 drauf.
Da sich an den Pins nichts tut und die init für mich recht vernünftig ausschaut. Kann's eigentlich nur noch daran liegen, dass die Pins irgendwie falsch konfiguriert sind. Hast Du da schon mal geschaut?
Vielleicht kannst Du auch zum testen mal die andere USART verwenden?

drew

beginner1101
27.06.2008, 13:16
Hallo nochmal,


Kann's eigentlich nur noch daran liegen, dass die Pins irgendwie falsch konfiguriert sind.

@drew Was meinst du damit?Wie soll ich die Pins konfigurieren??


Wir brauchen den ganzen Code.

@MCJenso Hab mal noch die C-Datei angehängt. Sonst hab ich außer der oben genannten Headerdatei nichts ;-). Und zwar laß ich immer erst 2 LED blinken, bevor ich was rausschick. Hab es gemacht um zu überprüfen ob die Endlosschleife auch richtig läuft!


#include <stdlib.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <stdio.h>
#include <util/delay.h>
#include "usart.h"


int main(void)
{
int y=0;
while(1)
{
DDRA = 0xff; //Port A auf Output schalten
PORTA = (1<<PA0);
_delay_ms(5);
PORTA = (1<<PA1);
_delay_ms(5);
PORTA = 0x00;
y=y+1;
PORTA = 0xff;
_delay_ms(100);

USART1_Init(); //USART konfigurieren
_delay_ms(10);
uart_puts("Hello World");
_delay_ms(10);

}
return(0);

}


Danke schon mal im vorraus für eure Mühe.

LG Anna

McJenso
27.06.2008, 19:09
Hallo,

ich habe deinen Code mal auf meinen At90CAN128 gespielt. Es funktioniert und ich kann auch so keinen Fehler finden, der das Verhalten erklärt.
Geändert habe ich die LED-Ausgabe (nur PA7), es ist ein 16Mhz Quarz, daher bekommt UBRR1L einen anderen Wert.
Die Zeile

UCSR1C = (0<<UMSEL1) | (0<<UPM1) | (1<<USBS1) | (3<<UCSZ1); habe ich durch
UCSR1C = (0<<UMSEL1) | (0<<UPM1) | (3<<UCSZ10); //9600,0,1
ersetzt, da nur Müll in hterm angekommen ist. Aber dein Oszi hätte aber auch das anzeigen müssen.
Weiter möchte ich dir als Tipp noch folgendes geben.
Die USART1_Init() gehört nicht in die while-Schleife. Die Schnittstelle muss nur einmal initialisiert werden.
Üblicherweise stehen in Headerdateien nur Definitionen, Prototypen, etc. C-Code gehört in C-Dateien und C-Dateien werden in das Projekt eingebunden (nicht über #include). Das hat aber nichts mit deinem Problem zu tun.

Bitte prüf mal die Einstellung an deinem Oszi. Zeigt das Oszi etwas an, wenn du mit dem PC sendest?

Gruß

Jens

beginner1101
30.06.2008, 10:22
Hallo Jens,

danke für deine Mühe. Wenn dass Programm be dir so läuft, ist der Fehler 100 % in der Hardware. Ich hab nochmal die Schaltung ans Oszi gehängt und ich bekomme am Tx einen LowPegel von ca. 9V , wenn ich was schicke bekomme ich Pegel von ca. + 9V. Ich hab nur mal ein "C" übertragen. Die Pegel, die ich rausmesse entsprechen aber nicht dem Erwartungswert???????????

Vielleicht ist mein Max232 kaputt. Das Terminalprogramm hab ich richtig eingstellt (gibts ja auch nicht so vil zum einstellen ;-) )

LG Anna

McJenso
30.06.2008, 19:23
Hallo,

die Pegel auf der PC-Seite sind mit -9V und 9V okay. Auf der µC-Seite dürfen es nur 5V sein. Kannst du den µC vom Max trennen und ihn auf der Seite brücken? Wenn du mit der Brücke Signale vom PC abschickst solltest du dein Echo im Terminalprogramm sehen können.

Gruß


Jens

beginner1101
02.07.2008, 11:21
Hy Jens,

dumme Frage, aber wie kann ich mit dem Terminalprogramm was rausschicken????
Es gibt bei mir ne kleine Neuigkeit. Und zwar hab ich im Terminalprogramm einen Kreis (°) dargestellt bekommen. Aber auch nur einmal,als ich dass Terminal geschlossen und neu gestartet habe bekam ich nichts mehr...................

Ach so, ich hab mal den MAX232 gewechselt, bringt aber auch nichts.........

LG Anna

McJenso
02.07.2008, 16:40
Hallo,

in der Annahme das du Windows benutzt, hier der Link zu hterm (http://www.der-hammer.info/terminal/index.htm). Das Programm erklärt sich dann beim mitrumspielen von selber. Ganz oben Parameter, dann empfangen und weiter unten senden.

Gruß

Jens

beginner1101
03.07.2008, 10:42
Hy Jens,

ich hab es so gemacht wie du beschrieben (vielen Dank ;-) ) hast. Wenn ich die beiden Pins brücke, bekomme ich ein Echo wenn ich was sende.
Das heißt ja wohl dann, dass die Hardware in Ordnung ist........ da du dass Programm ja freundlicherweise auf deinen AT90CAN übergespielt hast weis ich jetzt gar nicht mehr wo der Fehler sein könnte :-( . Hardware OK, Software OK , wo ist der Fehler ???????????????????

LG Anna

McJenso
03.07.2008, 19:20
Hallo,

so ganz sind wir noch nicht am Ende :wink:
Es gibt noch einige Fehlerquellen oder wir haben etwas übersehen.
Hast du eine LED zum Blinken am µC?
Bitte probiere einmal folgenden Code.


#include <avr/io.h>
#include <avr/interrupt.h>
#define LEDPORT DDRA |= (1<<PA7)
#define LEDON PORTA |= (1<<PA7)
#define LEDOFF PORTA &= ~(1<<PA7)
#define F_CPU 16000000

volatile uint8_t toggle;

void InitUart (void){
uint16_t ubrr;
ubrr = ((F_CPU/(9600L*16L))-1);
UBRR1H = (unsigned char)(ubrr>>8);
UBRR1L = (unsigned char) ubrr;
UCSR1B = (1<<RXEN1)|(1<<TXEN1);
UCSR1C = (1<<UCSZ11)|(1<<UCSZ10);
}



int main ()
{

LEDPORT;

TCCR1B = (1<<WGM12)|(1<<CS12)|(1<<CS10);
TIMSK1 |= (1<<OCIE1A);
OCR1A = 0x0680;
sei();
InitUart ();
while(1)
{
if (toggle > 0){
if (PORTA && (1<<PA7)){
LEDOFF;
}else{
LEDON;
}
toggle = 0;
}
while ( !(UCSR1A & (1<<UDRE1)));
UDR1 = 'a';
}
return 0;
}


ISR (TIMER1_COMPA_vect){
toggle = 1;
}




Im Bereich der #defines musst du das Programm halt anpassen. PORT und Pin der LED und Controllerfrequenz. Die LED sollte Blinken und das Programm ständig a senden. Bitte achte beim compilieren auch auf Warnungen. In hTerm 9600 Baud 8Data 1Stopbit keine Parity. Wenn das keinen Erfolg bringt, poste bitte die Einstellungen deiner Fusebits.
Die LED habe ich mit rein genommen, damit man erkennen kann, ob sich der Controller ständig resettet.

Gruß

Jens

beginner1101
05.07.2008, 15:36
Hy Jens,

ich hab dein Programm mal rübergespielt, (danke schonmal) . Es blinkt auch, schickt aber kein a sondern ein C (siehe Screenshot, einmal das Winows-Terminal, einmal das Hterm_terminal). Es kommt auch nicht regelmäßig. Was komisch ist, wenn icvh an dem /Tx, GND, RX)-Stecker rumspiele und ihn abziehe, wird immer was gesendet. Ich habe meine Fuses-Einstellungen auch mal gepostet. Ich hab den internen RC-Oscillator genommen, um sicher zuu gehen, dass es von der Baudrate stimmt. (Hab zwar den Quarz-Oszillator dazugebaut, aber ich benutze ihn nicht....)

Bis dann lG Anna

McJenso
05.07.2008, 18:21
Hallo,

na, es wird also etwas übertragen. Wir nähern uns dem Ziel. Du hast bei CKDIV8 einen Haken. Dadurch wird der Takt durch 8 geteilt. Hast du das berücksichtigt? Der Teiler in Kombination mit dem internen Quarz ist für RS232 eh etwas mager. Nimm den Quarz ohne den Teiler. Was mir noch aufgefallen ist, du hast JTAG aktiviert. Dadurch sind einige PIN's nicht als 'normale' I/O's zu gebrauchen. Das ist nicht schlimm, solange du daran denkst. Falls du JTAG nicht nutz empfehle ich dir, dass zu deaktivieren.

Gruß

Jens

beginner1101
06.07.2008, 16:19
Hy Jens,

es ist ein Wunder geschehen. Es funktioniert! ;-) Ich hab bei den Fuses, die Sachen verändert wo du gemeint hast. Jetzt funktioniert es!!!!! Vielen vielen vielen Dank. =D> Bin echt froh...........

GLG Anna