www.mikrocontroller.net

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

Autor: Sascha M. (stryker)
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


Autor: H.joachim Seifert (crazyhorse)
Datum:

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:

Ich habe die Taster vom Pollinboard verwendet, ein Schaltbild habe ich
angehangen.
Autor: Sascha M. (stryker)
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?
Autor: pillepalle (Gast)
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 ?
Autor: Gast2 (Gast)
Datum:

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:

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:

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:

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:

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 Email-Adresse ist freiwillig. Wenn Sie automatisch per Email ü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




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 erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net