Datum:
Hallo, ich habe das Pollin Evulationsboard mit einem ATmega32 und 16MHz Quarz und verwende CodeVisionAVR 2.03.4 Ich habe eine Schaltung aufgebaut, getestet und testen lassen bei der je ein Taster einen von drei Motoren drehen lässt bis ein Positionsschalter ein Stoppsignal gibt. Zusätzlich soll die Zeit aus einer Real-Time-Clock gelesen und über UART ausgegeben werden. Das Programm funktioniert in den ersten Testläufen (ca. 10 Tastenbetätigungen) einwandfrei, bis plötzlich alles verrückt spielt z. B. ein Taster startet dann zwei Motoren, die Zeitausgabe ist falsch oder der Positionsschalter wird nicht mehr als Stoppsignal erkannt (Motor läuft endlos). Die Fehler sind in keiner Reihenfolge reproduzierbar. Ich habe Stunden mit der Fehlersuche verbracht und alles nachgemessen, die Schaltung ist OK, die Signale richtig, nur der AVR spinnt. Die RTC wird in einem Testprogramm korrekt ausgegeben und das über Stunden, bei gleicher Schaltung. Ich weiß einfach nicht mehr weiter... Ich habe bestimmt etwas übersehen und würde mich deshalb freuen wenn mit jemand helfen könnte. Hier der Code:
/***************************************************** This program was produced by the CodeWizardAVR V2.03.4 Standard Automatic Program Generator © Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com Project : PCOA_1.2 Version : Date : 16.01.2009 Author : Sascha M Company : Comments: Drei Schalter steuern je einen Motor. Sensor deaktiviert alle Motoren. Real-Time-Clock implementiert, auslesen durch Sensor Chip type : ATmega32 Program type : Application Clock frequency : 16,000000 MHz Memory model : Small External RAM size : 0 Data Stack size : 512 *****************************************************/ #include <mega32.h> #include <delay.h> // I2C Bus functions #asm .equ __i2c_port=0x15 ;PORTC .equ __sda_bit=1 .equ __scl_bit=0 #endasm #include <i2c.h> // DS1337 Real Time Clock functions #include <ds1337.h> // Standard Input/Output functions #include <stdio.h> // Declare your global variables here #define taster1 2 // PD2 an Pin 16 #define taster2 3 // PD3 an Pin 17 #define taster3 4 // PD4 an Pin 18 #define motor1 5 // LED1 und Testmotor 1 #define motor2 6 // LED2 und Testmotor 2 #define motor3 7 // Summer und Testmotor 3 #define sensor 5 // PC5 an Pin 27 //#define drucke(t) printf(#t) void main(void) { // Declare your local variables here unsigned char h,m,s,da,mo,ye; // Input/Output Ports initialization // Port A initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTA=0x00; DDRA=0x00; // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTB=0x00; DDRB=0x00; // Port C initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTC=0x00; DDRC=0x00; // Port D initialization // Func7=Out Func6=Out Func5=Out Func4=In Func3=In Func2=In Func1=In Func0=In // State7=0 State6=0 State5=0 State4=T State3=T State2=T State1=T State0=T PORTD=0x00; DDRD=0xE0; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=FFh // OC0 output: Disconnected TCCR0=0x00; TCNT0=0x00; OCR0=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer 1 Stopped // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer 1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer 2 Stopped // Mode: Normal top=FFh // OC2 output: Disconnected ASSR=0x00; TCCR2=0x00; TCNT2=0x00; OCR2=0x00; // External Interrupt(s) initialization // INT0: Off // INT1: Off // INT2: Off MCUCR=0x00; MCUCSR=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00; // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: On // USART Mode: Asynchronous // USART Baud Rate: 9600 UCSRA=0x00; UCSRB=0x18; UCSRC=0x86; UBRRH=0x00; UBRRL=0x67; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00; // I2C Bus initialization i2c_init(); rtc_set_date(16,01,9); while (1) { if (PIND &(1<<taster1)) { PORTD |=(1<<motor1); //LED1 und Testmotor 1 ON } if (PIND &(1<<taster2)) { PORTD |=(1<<motor2); //LED2 und Testmotor 2 ON } if (PIND &(1<<taster3)) { PORTD |=(1<<motor3); // Summer und Testmotor 3 ON } if (PINC &(1<<sensor)) { //delay_ms(250); PORTD &=~((1<<motor1)|(1<<motor2)|(1<<motor3)); // deaktiviert alle Motoren rtc_get_date(&da,&mo,&ye); // printf("\r%i.%i.200%i",da,mo,ye); // Datum lesen und an UART ausgeben rtc_get_time(&h,&m,&s); // printf("\r%i:%i:%i\n",h,m,s); // Zeit lesen und an UART ausgeben }; }; // end while Arbeitsschleife } // end main |
Datum:
tja, auf jeden Fall solltest du erstmal die pullups an den Taster-Eingängen aktivieren - oder hast du welche extern dran?
Datum:
Angehängte Dateien:Ich habe die Taster vom Pollinboard verwendet, ein Schaltbild habe ich angehangen.
Datum:
Nun hab ich die Pullups für die Taster aktiviert und die Bedingung ist für alle drei if Schleifen erfüllt. Somit sind extern welche angeschlossen. Also Pullups wieder deaktiviert. Sind vielleicht die Schleifen falsch? Soll ich lieber switch und case verwenden? Aktuell habe ich herausgefunden dass Taster1 fehlerfreier funktioniert als Taster2 oder Taster3... Was kann das nur sein?
Datum:
moin mit dem IAR kenn ich mich leider nicht aus ,aber was mir aufgefallen ist ' // I2C Bus functions #asm .equ __i2c_port=0x15 ;PORTC .equ __sda_bit=1 .equ __scl_bit=0 #endasm #include <i2c.h> ' mach doch erstmal alle include anweisungen und setz danach die anderen Sachen ein. Könnte ja sein das er erst die i2c.h einbinden muss um dann mit dem #asm MAkro was anfangen kann. und wie sieht es mit dem Stack aus - die Fehler Beschreibung deutet auf einen typischen Stack Überlauf hin , oder Mehrfachbenutzung/überschreiben von Var in Unterprg. oder Interupts... keinen Simulator ?
Datum:
Probiere ob es mit LED's anstelle der Motoren klappt. Wenn ja, dann bringen die Motoren (bzw. deren Stoerungen) den Prozessor durcheinander. Gast2
Datum:
Sascha M. wrote: > Ich habe die Taster vom Pollinboard verwendet, ein Schaltbild habe ich > angehangen. Dann kann es durchaus an der Schaltung liegen, weil diese Schwachsinn ist. Bei jedem Tastendruck fließt ein starker Impulsstrom (kann kurzzeitig 10A erreichen!) über VCC, um die Kondensatoren aufzuladen. Diese Pulse sind ideal geeignet, um die CPU durcheinander zu bringen. Auch wenn diese Kondensatoren völlig unnötig sind, da es viel besser funktionierende Entprellroutinen gibt, kann man sie verwenden, wenn sie direkt parallel zu den Tastern liegen. Das ist wörtlich zu nehmen, d.h. vom Layout her müssen die Verbindungen auf kürzestem Wege erfolgen! Dann fließt der Impulsstrom nur im Kreis Taster - Kondensator, d.h. nicht mehr über das Netzteil. Peter
Datum:
pillepalle wrote: > mach doch erstmal alle include anweisungen und setz danach die anderen > Sachen ein. Könnte ja sein das er erst die i2c.h einbinden muss um dann > mit dem #asm > MAkro was anfangen kann. Dabei macht CodeVision keine Unterschiede. > keinen Simulator ? Doch CodeVision benutzt den AVR Studio Simulator, leider werden nicht alle Dateien #include't, somit wird bei der ersten CodeVision spezifischen Funktion ein Fehler gemeldet. Peter Dannegger wrote: >Auch wenn diese Kondensatoren völlig unnötig sind, da es viel besser >funktionierende Entprellroutinen gibt, kann man sie verwenden, wenn sie >direkt parallel zu den Tastern liegen. Sie liegen zum Glück in der Nähe und sind ganz gut zu gebrauchen. Kann das Pollinboard also nur empfehlen, wenn man nicht viel Geld ausgeben möchte. Gast2 wrote: >Probiere ob es mit LED's anstelle der Motoren klappt. >Wenn ja, dann bringen die Motoren (bzw. deren Stoerungen) den Prozessor >durcheinander. Definitiv! Ich hab ein Oszilloskop an gehangen und konnte die Störfrequenzen und Spannungsspitzen sehen. Die Spannung geht von 5V auf bis zu 8,5V hoch und die Frequenz war leider viel zu unregelmäßig um sie zu bestimmen. Der Hersteller der Motoren wurde angeschrieben und nach entsprechenden Entstörmöglichkeiten gefragt... Leider bleibt die Antwort noch aus. Eine eingebaute RTC, die DS1337C, liefert außerdem noch falsche Werte. Was zusätzlich den Fehler bei den Motoren bestätigt, vor allem weil dies mit LED's nicht passiert.
Datum:
Die Tasterschaltung des Boards hat bei mir zu undefiniertem Verhalten geführt. Nachdem ich R7 R8 R11 C19 C17 C18 entfernt und die Taster gegen Masse geschaltet habe läuft es wie geschmiert. http://www.mikrocontroller.net/articles/Pollin_ATM... MfG
Datum:
Danke Skua, den Summer hab ich auch gleich ausgebaut. Zu den Motorstörungen und somit zur Lösung: Ich habe, weil Gleichstrommotoren, ein Gleichspannungsnetzteil nur für die Motoren verwendet. Jetzt schaltet der ATmega32 die Basis des Transistors durch an dem die externe Spannungsquelle hängt. Massen beider Spannungsquellen miteinander verbinden. Eine andere Lösung wäre mit Gleichstromstellern oder auch DC-DC-Wandler möglich gewesen, wenn gewünscht könnte auch noch anstatt einem Transistor ein Optokoppler eingebaut werden. Vielen Dank für eure Hilfe Gruß, Sascha
