PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Rs-232 Funktioniert ?



tanger
15.10.2006, 09:22
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



#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
}

tanger
15.10.2006, 09:32
wie bekomm ich den raus ob der wirklich auf 16000000 läuft ? oder ob mein quarz nicht funktioniert (falsh angeschlossen ist )

tanger
15.10.2006, 09:35
mh funktioniert.. lag wohl an meinem monitor program ... nen program um den real takt anzuzeigen wäre aber schon cool ( =

ogni42
15.10.2006, 09:53
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.

tanger
15.10.2006, 10:52
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 ?

ogni42
15.10.2006, 12:06
es muss heissen:



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.

tanger
15.10.2006, 12:43
mh super danke jetz geht es ... mein atmega läuft nur auf 1000000 troz 16mhz quarz ... jemand da ne idee ?

Bubi_00
15.10.2006, 12:48
hmm hast du die Fuse Bits richtig gesetzt ?
Musst du zuerst auf externen Quarz umschalten.

mfg

tanger
15.10.2006, 12:51
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

tanger
15.10.2006, 12:52
sch**** ich wusste ich hatte was vergessen mach ich gleich mal bubi vieln dank

tanger
15.10.2006, 13:08
mh hat sich erledigt nachtdem ich den auf 16mhz getaktet hab läuft die if bedingung auch

vieln dank nochmal

tanger
15.10.2006, 14:37
hi

ich hätte noch ne frage wegen des PWM Signals das wäre der code den ich kopiert habe ... funktioniert der nicht so wie ich mir das denke ... ich messe an OC1A OC1B pin 19/18 beim atmega32

hat noch jemand eine idee was ich falsch mache ?



#include <avr/io.h>


/* Timer1 initialisieren */
void timer1_init(void);


int main(void)
{
/* Timer1 initialisieren */
timer1_init();

OCR1AL = 0xff;
OCR1BL = 0x7f;

while (1)
;
}

/* Timer1 initialisieren */
void timer1_init(void)
{
/* normale 8-bit PWM aktivieren ( nicht invertiert ),
Das Bit WGM10 wird im Datenblatt auch als PWM10 bezeichnet */
TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM10);

/* Einstellen der PWM-Frequenz auf 14 kHz ( Prescaler = 1 ) */
TCCR1B = (1<<CS10);

/* Interrupts für Timer1 deaktivieren
Achtung : Auch die Interrupts für die anderen Timer stehen in diesem Register */
TIMSK &= ~0x3c;
}