Hallo Zusammen, ich hoffe, ich kann euch mein Problemm, mit dem ich seit heutemorgen zukämpfen habe, anschaulich beschreiben. Also ich habe zwei Controller ein Atmega8 und ein AT90pwm3B + ein Pwm-Programm geschrieben in Sprache C (siehe unten). dieses Programm läuft wunderbar auf ATmega8. Der Avr-Studio erzeugt davon ein HEX-file und das wird in den ATmega8 übertragen. Die gleiche Vorgehenweise funktioniert mit dem anderen Cotroller nämlich mit AT90PWM3B nicht. AVR-Studio meldet keinen Fehler aber einen Haufen Warnung. es wird kein HEX-File erzeugt und ich kann das programm in AVR-Studio nicht simulieren. Im Menu Debug ist bei Toggel Breakpunkt einen roten punkts zusehen.den kann ich zwar wegmachen aber der taucht immer wieder auf. Vielleicht kann jemand mich auf den Fehler, den ich leider bis jetzt nicht gefunden habe, aufmerksam machen. ich danke euch mfg kaveh das programm unten für AT90pwm3B. die erste Bibliotheken nämlich <avr/io.h> und <stdint.H> habe ich für ATmega8 verwendet und es kamm keine fehlermeldung. #include <avr/io.h> #include <stdint.h> #include"mcu.h" #include"compiler.h" #include"adc_drv.h" #include"amplifier_drv.h" #include"comparator_drv.h" // Analog/Digital Wandler initialisieren void adc_init(void) { // externe Referenzspannung und AD-Wandlerkanal 9 (ADC9 / PC5) auswählen ADMUX = 0; // AD-Wandler einschalten und Prescaler = 64 einstellen (enstpricht 115 khz Wandlertakt) ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1); } // Timer einstellen void timer_init(void) { // OC1A auf Ausgang DDRD = (1 << PD2 ); // Was die einzelnen Einstellungen genau bedeuten steht im Datenblatt // // Timer 1 einstellen // // Modus 14: Fast PWM, Top von ICR1 // // >> WGM13 WGM12 WGM11 WGM10 // 1 1 1 0 // // Timer Vorteiler: 1 // // >> CS12 CS11 CS10 // 0 0 1 // // Steuerung des Ausgangsport: Set at BOTTOM, Clear at match // // >> COM1A1 COM1A0 // 1 0 TCCR1A = (1<<COM1A1) | (1<<WGM11); TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS10); // Den Endwert (TOP) für den Zähler setzen // Der Zähler zählt bis zu diesem Wert // Hier kann man unter anderem die Frequenz der PWM einstellen ICR1 = 0x0080; // 0x0080 ist eine Abstufung mit 128 Stufen. // Problem: Wenn wir einen Motor mir PWM ansteuern vibrieren // seine Teile automatisch in der Frequenz mit. // Also legen wir diese in den nicht hörbaren Bereich. // 4MHz / 128 = 31250 Hz } int main() { // 16bit Variable uint16_t buffer; // Timer für PWM initialisieren timer_init(); // A/D - Wandler initialisieren adc_init(); // OCR1A ist der Compare Wert // Wenn der Zähler diesen Wert erreicht, wird mit // obiger Konfiguration der OC1A Ausgang abgeschaltet // Sobald der Zähler wieder bei 0 startet, wird der // Ausgang wieder auf 1 gesetzt // // Durch Verändern dieses Wertes, werden die unterschiedlichen // PWM Werte eingestellt. // Startwert = 0. Wird in der while-Schleife gesetzt. OCR1A = 0x0000; while( 1 ) { // Wandlung vom analogen Eingang starten ADCSRA |= (1<<ADSC); // Warten bis die AD-Wandlung abgeschloßen ist while ( !(ADCSRA & (1<<ADIF)) ) ; // AD-Wert auslesen. // ADCH muss als zweites gelesen werden, da nachdem ADCL gelesen wurde // das ADC-Register gesperrt ist bis ADCH auch ausgelesen wurde. // buffer = ADCL | (ADCH<<8); // Oder einfacher. buffer = ADC; // Da die PWM eine Auflösung von 8bit hat aber der buffer 10bit gross ist // müssen wir noch transformieren OCR1A = (buffer>>3); } } die Warnmeldungen:alles mit einem gelben punkt versehen ../mcu.h:430:1: warning: "/*" within comment ../mcu.h:461:1: warning: "PC7" redefined In file included from c:/winavr-20100110/lib/gcc/../../avr/include/avr/io.h:408, from ../PWMAT90PWM3B.c:1: c:/winavr-20100110/lib/gcc/../../avr/include/avr/portpins.h:202:1: warning: this is the location of the previous definition ../mcu.h:462:1: warning: "PC6" redefined . . . . . . . . c:/winavr-20100110/lib/gcc/../../avr/include/avr/sfr_defs.h:234:1: warning: this is the location of the previous definition
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.