Danke erst einmal. Ich habe das RXCIE jetzt mal rausgenommen, aber ich kann die PWM über die Taster immer noch nicht steuern. Ich habe nun zusätzlich im Quelltext die Zeile "uart_putc(var);" gleich nach "var = uart_getc();" eingefügt. Das empfangene Zeichen wird sofort zurück gesendet. Das klappt mit Hyperterminal auch. Die PWM lässt sich aber über die beiden Taster komischerweise immer noch nicht steuern.
Die ISR für den Receive-IRQ "SIGNAL(SIG_UART_RECV){...}" will ich später mal noch mit einbauen. Jetzt soll erstmal die einfache Variante funktionieren.
Mein Quelltext sieht jetzt so aus.:
Code:
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
// Delay Funktion
void delay_ms (uint16_t delay_time)
{
uint16_t k=0;
while (k++<delay_time) {}
}
// Initialisierung der PWM
static void enable_pwm(void)
{
TCCR1A = 0x00; //Timer auf 0
TCCR1B = 0x00;
// PWM: 8-bit, phasenkorrekt
TCCR1A |= (1<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) | (1<<WGM10); //Timer einstellen
//TCCR1B |= (1<<CS10) | (1<<CS12);
//TCCR1B |= (1<<CS10) | (1<<CS11) | (1<<CS12);
TCCR1B |= (1<<CS10); //kein Prescaling
}
// Initialisierung UART
void uart_init (void)
{
/* USART-Init 38400 Baud bei 8MHz für Mega32 */
UCSRB = (1<<RXEN) | (1<<TXEN);
/* Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit */
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
UBRRH = 0; // Highbyte ist 0
UBRRL = 12; // Lowbyte ist 51 ( dezimal )
}
// Zeichen senden
int uart_putc(unsigned char c)
{
while (!(UCSRA & (1<<UDRE))); /* warten bis Senden moeglich */
UDR = c; /* sende Zeichen */
return 0;
}
// String senden
void uart_puts (char *s)
{
while (*s)
{ /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
uart_putc(*s);
s++;
}
}
// Zeichen empfangen
uint8_t uart_getc (void)
{
while (!(UCSRA & (1<<RXC))); // warten bis Zeichen verfuegbar
return UDR; // Zeichen aus UDR an Aufrufer zurueckgeben
}
int main(void)
{
uint16_t status=0;
uint8_t var;
DDRA=0; //PORTA as Input
PORTA=255;
DDRD |= (1 << PD4);
DDRD |= (1 << PD5);
uart_init();
enable_pwm();
/* Loop forever */
while (1)
{
// Steuerung der PWM-Kanäle über 2 Taster (Up/Down)
if (status>127)
{
status=128;
}
if (status<2)
{
status=1;
}
if (( PINA & (1<<PINA3))==0 )
{
delay_ms(50000);
status=status+1;
}
if (( PINA & (1<<PINA4))==0 )
{
delay_ms(50000);
status=status-1;
}
OCR1BL = status; // Kanal 1 verschiedene Werte
OCR1AL = status; // Kanal 2 verschiedene Werte
// Versuch: Wertzuweisung über das UART vom PC aus
var = uart_getc(); /// AN DIESER STELLE KOLLIDIERT ES MIT DER PWM
uart_putc(var);
//status=var;
}
}
Lesezeichen