www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATmega32, Taster funktionieren erst, später spinnt der AVR


Autor: Sascha M. (stryker)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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



Autor: H.Joachim Seifert (crazyhorse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tja, auf jeden Fall solltest du erstmal die pullups an den 
Taster-Eingängen aktivieren - oder hast du welche extern dran?

Autor: Sascha M. (stryker)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe die Taster vom Pollinboard verwendet, ein Schaltbild habe ich 
angehangen.

Autor: Sascha M. (stryker)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: pillepalle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 ?

Autor: Gast2 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probiere ob es mit LED's anstelle der Motoren klappt.
Wenn ja, dann bringen die Motoren (bzw. deren Stoerungen) den Prozessor 
durcheinander.

Gast2

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Sascha M. (stryker)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Skua (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Sascha M. (stryker)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.