Ich verwende am ATmega48 einen PWM-Kanal (OC0A an PD6) doch sobald ich in der Software die LCD-Library von P. Fleury verwende, funktioniert dieser Pin nicht mehr richtig, d.h. das PWM-Signal ist nichtmehr vorhanden. Am Oszilloskop sieht man nur ein Rechtecksignal bei um die 0,2V, was aber von der Form her scheinbar nichts mit dem PWM-Signal zu tun hat.
Eigentlich dürfte dieser Pin PD6 nicht für das LCD verwendet werden, denn der entsprechende Abschnitt in lcd.h sieht so aus:
Code:
#define LCD_PORT PORTB /**< port for the LCD lines */
#define LCD_DATA0_PORT PORTB /**< port for 4bit data bit 0 */
#define LCD_DATA1_PORT PORTB /**< port for 4bit data bit 1 */
#define LCD_DATA2_PORT PORTD /**< port for 4bit data bit 2 */
#define LCD_DATA3_PORT PORTC /**< port for 4bit data bit 3 */
#define LCD_DATA0_PIN 7 /**< pin for 4bit data bit 0 */
#define LCD_DATA1_PIN 6 /**< pin for 4bit data bit 1 */
#define LCD_DATA2_PIN 7 /**< pin for 4bit data bit 2 */
#define LCD_DATA3_PIN 3 /**< pin for 4bit data bit 3 */
#define LCD_RS_PORT PORTB /**< port for RS line */
#define LCD_RS_PIN 4 /**< pin for RS line */
#define LCD_RW_PORT PORTB /**< port for RW line */
#define LCD_RW_PIN 5 /**< pin for RW line */
#define LCD_E_PORT PORTB /**< port for Enable line */
#define LCD_E_PIN 0 /**< pin for Enable line */
Ich schreib nochmal meinen Code dazu, falls der relevant ist:
Code:
#include <avr/io.h>
#include "lcdlibrary/lcd.h"
#include <util/delay.h>
#define SAUGER_PORT PORTD
#define SAUGER_PIN PD6
void Sauger(int Geschwindigkeit)
{
OCR0A = Geschwindigkeit;
};
void PWM_Init (void)
{
DDRD |= (1<<PD6);
//Fast-PWM-Mode, Clear on CompareMatch, Set on Bottom, Clk/8
TCCR0A |= (1<<COM0A1) | (1<<WGM00) | (1<<WGM01);
TCCR0A &= ~(1<<COM0A0);
TCCR0B |= (1<<CS01);
TCCR0B &= ~((1<<WGM02) | (1<<FOC0A) | (1<<FOC0B) | (1<<CS00) | (1<<CS02));
//Compare-Wert
OCR0A = 0x0;
};
void Init (void)
{
lcd_init(LCD_DISP_ON);
lcd_clrscr();
PWM_Init();
};
int main (void)
{
Init();
lcd_puts("Staubsaugerroboter");
Sauger(128);
while (1)
{
}
};
Sobald ich aus obigem Code lcd_init(), lcd_clrscr() und lcd_puts() herausnehme, ist das PWM-Signal wieder richtig da.
Kann mir da jemand auf die Sprünge helfen?
Lesezeichen