-
Rs-232 Funktioniert ?
Hi,
ich hab das unten angehangene Program auf meinen ATMega32 gefalshed ich bekomme allerdings egal welches zeichen ich sende immer das gleiche zurück (À).
SYSCLK und BAUD sind natürlich angepasst
Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#define SYSCLK 7372800
#define BAUD 38400UL
#define UBRR_BAUD ((SYSCLK/(16*BAUD))-1)
/* USART initialisieren */
void uart_init(void);
void init(void);
int main(void)
{
/* USART initialisieren */
uart_init();
sei();
/* Nichts tun. Die Interrupts erledigten den Rest */
while (1)
;
}
void uart_init(void)
{
/* Baudrate einstellen ( Normaler Modus ) */
UBRRH = (unsigned char) (UBRR_BAUD>>8);
UBRRL = (unsigned char) UBRR_BAUD;
/* Aktivieren des Empfängers, des Senders und des "Daten empfangen"-Interrupts */
UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
/* Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit */
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}
/* Interrupt wird ausgelöst sobald neue Daten im USART-Empfangspuffer liegen */
SIGNAL(SIG_UART_RECV)
{
unsigned char buffer;
/* Daten aus dem Puffer lesen ... */
buffer = UDR;
/* ... warten bis der Sendepuffer leer ist ... */
while ( !( UCSRA & (1<<UDRE)) )
;
/* ... und gleich wieder zurück schicken */
UDR = buffer;
}
void init(void)
{
DDRB = 0xff; // PortB als Ausgang deklarieren
PORTB = 0x00; // Ports auf LOW schalten
}
-
wie bekomm ich den raus ob der wirklich auf 16000000 läuft ? oder ob mein quarz nicht funktioniert (falsh angeschlossen ist )
-
mh funktioniert.. lag wohl an meinem monitor program ... nen program um den real takt anzuzeigen wäre aber schon cool ( =
-
Ist zwar nur ne grobe Hausnummer, aber lass doch eine LED im Sekundentakt blinken. 10 Zyklen stoppen und dann kannst Du abschätzen wie Dein tatsächlicher Takt ist.
-
mh ich war wohl was voreilig ich bekomme zwar unterschiedliche zeichen zurück aber keine buchstaben die ich eigentlich auch sende ...
if (buffer == "a") /* Falls Taster an PIN PB0 gedrueckt.. */
PORTD = ( 1 << PD7 );
würde das mit der if bedinung so funktionieren ?
zu der led würde die nicht 10 mal jede sekunde blinken egal welcher takt eingestellt ist ? da der timer ja aus der taktrate berechnet wird ?
-
es muss heissen:
Code:
if (buffer == 'a')
{
PORTD = (1<<PD7);
}
weil buffer ja vom typ unsigned char ist.
Den LED Takt im Code berechnest Du, z.B. aus SysCLK = 8000000.
Wenn jetzt stattdessen die tatsächlice Taktrate des Chips nur 1MHz ist, blinkt die LED 8 mal langsamer.
-
mh super danke jetz geht es ... mein atmega läuft nur auf 1000000 troz 16mhz quarz ... jemand da ne idee ?
-
hmm hast du die Fuse Bits richtig gesetzt ?
Musst du zuerst auf externen Quarz umschalten.
mfg
-
also die zeichen kommen jetz richtig zurück bis auf einige wenige male ... wie werden die denn im buffer gespeichert als ASCII ? das ich die so wie oben geschrieben abfragen kann ?
da die if bedingung nciht funktioniert ) =
habs mal mit buffer =! a probiert ... dies funktioniert ... da auch das a zurück kommt denke ich mal das es nicht im ASCII format gespeichert wird
-
sch**** ich wusste ich hatte was vergessen mach ich gleich mal bubi vieln dank