merkwürdiges Verhalten vom ATMega 88PA

Guten Abend Profis,
sketch geschrieben, auf einen originalen Arduino UNO R3 geschoben, auf dem Steckbrett verdrahtet:
Läuft! Also Tasterdruck wird erkannt, Millis funktionieren, Ansteuerung der Pins klappt.
(Sketch hinten dran).

Mit dem Uno das Programm auf einen ATMega 88PA gebrannt, verdrahtet und:
Sketch läuft ohne auf einen Tastendruck zu warten, durch.

Hardware Verdrahtung geprüft, Taster mit Widerstand wie am UNO angeschlossen.
Ausgangspins gehen auf einen UDN 2981.

Jetzt brauche ich mal Hilfe beim Fehlersuchen.

Was könnte noch als Fehlerquelle in Betracht kommen? Gibt es da die üblichen Verdächtigen?

Merci.
Flötzinger

/*Programm für 4 Weichenstrassen
µC ATMega 88 
1 LCD Modul 4x20 Zeichen
8 Taster, gestellt und gesperrt
8 Relaisansteuerungen SPS IN A/ IN B

*/ 
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4); // Datenleitungen an 27/ 28

const int Taster1 =  3; // Gleis 64 gesperrt; Geradefahrt W15, W16, W4
const int Taster2 =  2; // Gleis 64 gestellt; Abzweigfahrt W15, W16, W4
const int Taster3 = 16; // Gleis 63 gestellt; Geradefahrt W15, W16
const int Taster4 =  4; // Gleis 63 gesperrt; Abzweigfahrt W15, W16
const int Taster5 =  5; // Gleis 52 gestellt; Geradefahrt W15, W2
const int Taster6 = 17; // Gleis 52 gesperrt; Abzweigfahrt W15, W2
const int Taster7 =  7; // Gleis 53 gesperrt; Geradefahrt W15
const int Taster8 =  6; // Gleis 53 gestellt; Abzweigfahrt W15

const int Weiche_15_Abz =  8;
const int Weiche_15_Ger =  9;
const int Weiche_16_Abz = 10;
const int Weiche_16_Ger = 11;
const int Weiche_04_Abz = 12;
const int Weiche_04_Ger = 13;
const int Weiche_02_Abz = 14;
const int Weiche_02_Ger = 15;

unsigned long Startzeit1 =0; // Start Zeitablauf Anlassung Relais
unsigned long Ansteuerung =1000; // Anlassung Relais-> Kontakt SPS IN
//**************************************
void setup(){
 pinMode(Taster1,INPUT); // Gleis 64 gestellt; SPS 4,  ,IN A
 pinMode(Taster2,INPUT); // Gleis 64 gesperrt; SPS 4,  ,IN B
 pinMode(Taster3,INPUT); // Gleis 63 gestellt; SPS 4,  ,IN A
 pinMode(Taster4,INPUT); // Gleis 63 gesperrt; SPS 4,  ,IN B
 pinMode(Taster5,INPUT); // Gleis 52 gestellt; SPS 4,  ,IN A
 pinMode(Taster6,INPUT); // Gleis 52 gesperrt; SPS 4,  ,IN B
 pinMode(Taster7,INPUT); // Gleis 53 gestellt; SPS 4,  ,IN A
 pinMode(Taster8,INPUT); // Gleis 53 gesperrt; SPS 4,  ,IN B  

 pinMode(Weiche_15_Abz, OUTPUT);
 pinMode(Weiche_15_Ger, OUTPUT);
 pinMode(Weiche_16_Abz, OUTPUT);
 pinMode(Weiche_16_Ger, OUTPUT);
 pinMode(Weiche_04_Abz, OUTPUT);
 pinMode(Weiche_04_Ger, OUTPUT);
 pinMode(Weiche_02_Abz, OUTPUT);
 pinMode(Weiche_02_Ger, OUTPUT);

 lcd.init(); 
 lcd.backlight();
}
//**************************************
void loop(){
// Weichenstrasse Gleis 64 Kohlenhandlung gestellt
if (digitalRead(Taster1)==HIGH){
    digitalWrite(Weiche_15_Abz,HIGH); // SPS 4, W15, IN A
    digitalWrite(Weiche_16_Abz,HIGH); // SPS 4, W16, IN A
    digitalWrite(Weiche_04_Abz,HIGH); // SPS 1, W04, IN A
      lcd.clear();
      lcd.setCursor(0,0); // Cursorpos 0, Zeile 1
      lcd.print(F("Kohlenhandlung      "));
      lcd.setCursor(0,1);
      lcd.print(F("Weichen auf Abzweig "));
      lcd.setCursor(0,2);
      lcd.print(F("W 15, W 16, W 4    "));
      lcd.setCursor(0,3);
      lcd.print(F("Gleis 64 gestellt  "));  
      Startzeit1=millis(); 
}  
else if(millis()-Startzeit1>=Ansteuerung){
       digitalWrite(Weiche_15_Abz,LOW);// SPS 4, W15, IN A
       digitalWrite(Weiche_16_Abz,LOW);// SPS 4, W16, IN A
       digitalWrite(Weiche_04_Abz,LOW);// SPS 1, W04, IN A
}
// Weichenstrasse Gleis 64 Kohlenhandlung gesperrt
if (digitalRead(Taster2)==HIGH){
    digitalWrite(Weiche_15_Ger,HIGH); // SPS 4, W15, IN B
    digitalWrite(Weiche_16_Ger,HIGH); // SPS 4, W16, IN B
    digitalWrite(Weiche_04_Ger,HIGH); // SPS 1, W04, IN B
      lcd.clear();
      lcd.setCursor(0,0); // Cursorpos 0, Zeile 1
      lcd.print(F("Kohlenhandlung      "));
      lcd.setCursor(0,1);
      lcd.print(F("Weichen auf Gerade "));
      lcd.setCursor(0,2);
      lcd.print(F("W 15, W 16, W 4    "));
      lcd.setCursor(0,3);
      lcd.print(F("Gleis 64 gesperrt  "));  
      Startzeit1=millis(); 
}  
else if(millis()-Startzeit1>=Ansteuerung){
       digitalWrite(Weiche_15_Ger,LOW);// SPS 4, W15, IN B
       digitalWrite(Weiche_16_Ger,LOW);// SPS 4, W16, IN B
       digitalWrite(Weiche_04_Ger,LOW);// SPS 1, W04, IN B
}
// Weichenstrasse Gleis 63 Diesellager gestellt
if (digitalRead(Taster3)==HIGH){
    digitalWrite(Weiche_15_Abz,HIGH); // SPS 4, W15, IN A
    digitalWrite(Weiche_16_Abz,HIGH); // SPS 4, W16, IN A
    
      lcd.clear();
      lcd.setCursor(0,0); // Cursorpos 0, Zeile 1
      lcd.print(F("Diesellager         "));
      lcd.setCursor(0,1);
      lcd.print(F("Weichen auf Abzweig "));
      lcd.setCursor(0,2);
      lcd.print(F("W 15, W 16         "));
      lcd.setCursor(0,3);
      lcd.print(F("Gleis 63 gestellt  "));  
      Startzeit1=millis(); 
}  
else if(millis()-Startzeit1>=Ansteuerung){
       digitalWrite(Weiche_15_Abz,LOW);// SPS 4, W15, IN A
       digitalWrite(Weiche_16_Abz,LOW);// SPS 4, W16, IN A
       }
// Weichenstrasse Gleis 63 Diesellager gesperrt
if (digitalRead(Taster4)==HIGH){
    digitalWrite(Weiche_15_Ger,HIGH); // SPS 4, W15, IN B
    digitalWrite(Weiche_16_Ger,HIGH); // SPS 4, W16, IN B
    //digitalWrite(Weiche_04_Ger,HIGH); // SPS 1, W04, IN B
      lcd.clear();
      lcd.setCursor(0,0); // Cursorpos 0, Zeile 1
      lcd.print(F("Diesellager        "));
      lcd.setCursor(0,1);
      lcd.print(F("Weichen auf Gerade "));
      lcd.setCursor(0,2);
      lcd.print(F("W 15, W 16,        "));
      lcd.setCursor(0,3);
      lcd.print(F("Gleis 63 gesperrt  "));  
      Startzeit1=millis(); 
}  
else if(millis()-Startzeit1>=Ansteuerung){
       digitalWrite(Weiche_15_Ger,LOW);// SPS 4, W15, IN B
       digitalWrite(Weiche_16_Ger,LOW);// SPS 4, W16, IN B
       digitalWrite(Weiche_04_Ger,LOW);// SPS 1, W04, IN B
}
// Weichenstrasse Gleis 52 Lokschuppen links gestellt
if (digitalRead(Taster5)==HIGH){
    digitalWrite(Weiche_15_Abz,HIGH); // SPS 4, W15, IN A
    digitalWrite(Weiche_02_Abz,HIGH); // SPS 4, W16, IN A
      lcd.clear();
      lcd.setCursor(0,0); // Cursorpos 0, Zeile 1
      lcd.print(F("Lokschuppen links   "));
      lcd.setCursor(0,1);
      lcd.print(F("Weichen auf Abzweig"));
      lcd.setCursor(0,2);
      lcd.print(F("W 15, W 2    "));
      lcd.setCursor(0,3);
      lcd.print(F("Gleis 52 gestellt  "));  
      Startzeit1=millis(); 
}  
else if(millis()-Startzeit1>=Ansteuerung){
       digitalWrite(Weiche_15_Abz,LOW);// SPS 4, W15, IN A
       digitalWrite(Weiche_02_Abz,LOW);// SPS 4, W16, IN A
}
// Weichenstrasse Gleis 52 Lokschuppen links gesperrt
if (digitalRead(Taster6)==HIGH){
    digitalWrite(Weiche_15_Ger,HIGH); // SPS 4, W15, IN B
    digitalWrite(Weiche_02_Ger,HIGH); // SPS 4, W16, IN B
      lcd.clear();
      lcd.setCursor(0,0); // Cursorpos 0, Zeile 1
      lcd.print(F("Lokschuppen links  "));
      lcd.setCursor(0,1);
      lcd.print(F("Weichen auf Gerade "));
      lcd.setCursor(0,2);
      lcd.print(F("W 15, W2            "));
      lcd.setCursor(0,3);
      lcd.print(F("Gleis 52 gesperrt  "));  
      Startzeit1=millis(); 
}  
else if(millis()-Startzeit1>=Ansteuerung){
       digitalWrite(Weiche_15_Ger,LOW);// SPS 4, W15, IN B
       digitalWrite(Weiche_02_Ger,LOW);// SPS 4, W16, IN B  
}
// Weichenstrasse Gleis 53 Lokschuppen rechts gestellt
if (digitalRead(Taster7)==HIGH){
    digitalWrite(Weiche_15_Abz,HIGH); // SPS 4, W15, IN A
      lcd.clear();
      lcd.setCursor(0,0); // Cursorpos 0, Zeile 1
      lcd.print(F("Lokschuppen rechts  "));
      lcd.setCursor(0,1);
      lcd.print(F("Weichen auf Abzweig "));
      lcd.setCursor(0,2);
      lcd.print(F("W 15         "));
      lcd.setCursor(0,3);
      lcd.print(F("Gleis 53 gestellt  "));  
      Startzeit1=millis(); 
}  
else if(millis()-Startzeit1>=Ansteuerung){
       digitalWrite(Weiche_15_Abz,LOW);// SPS 4, W15, IN A
}
// Weichenstrasse Gleis 53 Lokschuppen rechts gesperrt
if (digitalRead(Taster8)==HIGH){
    digitalWrite(Weiche_15_Ger,HIGH); // SPS 4, W15, IN B
      lcd.clear();
      lcd.setCursor(0,0); // Cursorpos 0, Zeile 1
      lcd.print(F("Lokschuppen rechts "));
      lcd.setCursor(0,1);
      lcd.print(F("Weichen auf Gerade "));
      lcd.setCursor(0,2);
      lcd.print(F("W 15               "));
      lcd.setCursor(0,3);
      lcd.print(F("Gleis 53 gesperrt  "));  
      Startzeit1=millis(); 
}  
else if(millis()-Startzeit1>=Ansteuerung){
       digitalWrite(Weiche_15_Ger,LOW);// SPS 4, W15, IN B
}

}//Ende Loop

Was könnte noch als Fehlerquelle in Betracht kommen? Gibt es da die üblichen Verdächtigen?

Ja!

Der Fehler befindet sich meistens im OSI Schichten Modell auf Ebene 8

Ich habe nur eine Tip aber weiß nichts genaues.

Der ATmega88 ist ein anderer Controller als der ATmega328
Der Hauptunterschied ist der Speicher. Der 88 hat 1/4 des Speichers als der 328 und die Taktfrequenz darf max 8MHz sein.

Grüße Uwe

Hallo,

uwefed:
Ich habe nur eine Tip aber weiß nichts genaues.

Der ATmega88 ist ein anderer Controller als der ATmega328
Der Hauptunterschied ist der Speicher. Der 88 hat 1/4 des Speichers als der 328 und die Taktfrequenz darf max 8MHz sein.

Grüße Uwe

Flash 8kB statt 32kB, EEPROM 512Byte statt 1kB, Ram 1kB statt 2kB, Takt darf genauso bis 20MHz sein.

Er wird es ja hoffentlich (irgendwie) auch für den Mega88 erzeugt haben...

Gruß aus Berlin
Michael

Hallo,

Ich vermute das der TO den Sketch nicht für den 88PA kompiliert hat, sondern weiterhin für den 328P und einfach rüber geprügelt hat. Vielleicht kennt er nicht das noch nicht. GitHub - MCUdude/MiniCore: Arduino hardware package for ATmega8, ATmega48, ATmega88, ATmega168, ATmega328 and ATmega328PB

Ups, Da hab ich das falsche Datenblatt angesehen (die nicht PA Version).

Die Max Taktfrequenz ist nicht 20Mhz sondern 16Mhz. Das macht in diesem Fall keinene Unterschied weil die Arduinos alle max mit 16Mhz laufen.
Grüße Uwe

Hallo,

jetzt muss ich nochmal darauf rumreiten. Die max. Taktfrequenz dieser Serie ist ...

[ ] 8 MHz
[ ] 16 MHz
[x] 20 MHz :wink:

... unabhängig mit was die Arduinos den µC takten.

Nur die "V" Modelle sind bis max .10 MHz spezifiert.

laut http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-9223-Automotive-Microcontrollers-ATmega48PA-ATmega88PA-ATmega168PA_Datasheet.pdf
Seite 270 sind's nur 16Mhz
laut http://ww1.microchip.com/downloads/en/devicedoc/atmel-8271-8-bit-avr-microcontroller-atmega48a-48pa-88a-88pa-168a-168pa-328-328p_datasheet_complete.pdf was 1 Jahr jünger ist sinds 20Mhz.

Grüße Uwe

Hallo,

aha, okay, das sind spezielle Ausführungen für Automotive, also mit erhöhten Anforderungen.
Interessant was man so für Datenblätter finden kann. :slight_smile:
Ich lande immer bei den normalen Manuals.
ATMEGA88PA >> Documents

Hallo!

Doc_Arduino:
Hallo,

Ich vermute das der TO den Sketch nicht für den 88PA kompiliert hat, sondern weiterhin für den 328P und einfach rüber geprügelt hat. Vielleicht kennt er nicht das noch nicht. GitHub - MCUdude/MiniCore: Arduino hardware package for ATmega8, ATmega48, ATmega88, ATmega168, ATmega328 and ATmega328PB

unter Werkzeuge/ Board: ATMega 88PA ausgewählt, 8Mhz,Compiler LTO disabled, BOD disabled.

Hatte ja schon das Vergnügen, mir div. dinge von Github zu besorgen/ dran zudenken eben für neue µC cores
zu installieren.

werde aber gern nochmal nachlegen/ nach installieren.

combie:
Ja!

Der Fehler befindet sich meistens im OSI Schichten Modell auf Ebene 8

wieso wusste ich das ?! :-)oller Spassvogel. dachte da eher an Keyser Soze....

  • geht weiter suchen und probieren*
    Danke für die ersten Tipps!

Edith schreibt noch ein Pa bei ATMega 88

oller Spassvogel

Was erwartest du?

Wenn deine Taster nicht funktionieren, dann hast du was falsch gemacht!
Leider sehen wir weder Aufbau, noch Schaltplan.

Damit KANN meine Hilfe nur nahe Null sein.

Du hast ein LCD daran angeschlosen.
Also kannst du dir auch die Tasten Auswertung anzeigen lassen.

Wir nicht.
Wir sehen nichts.

Hurray, läuft.
Taster rausgeworfen (Danke Combie!),bessere vom Laden die Strasse runter geholt( echte 60 Ct/ Stück).
Nochmal nach verdrahtet, festen Sitz im Brettchen überprüft.
Zur Vorsicht die Taktfrequenz auf 1 Mhz runter gestellt.
Naja, ist dann etwas langsam...zum probieren aber garnicht so schlecht.

bin mir allerdings nicht so sicher, ob ich doch noch zusätzlich entprellen soll, läuft ja bisher ohne Probleme.
Gibts da eine einfache Version für acht Taster?

Flötzinger

Hier sind die wichtigsten Entprellmethoden erklärt.
Auch eine Variante für 8 Taster gleichzeitig ist dabei.

merci.
ist was für später.
Jetzt erstmal wieder andere Dinge dengeln...
schönen Abend zusammen!

PS.:
Trinkt bitte Glühwein nur von glücklichen Glühen...

guten Abend,
noch eine Frage, vielleicht hatte jemand schon ein ähnlichen Fall:
Arduino Pin A1/ 15 ist auf dem ATmega auch mit PC1 benannt. So das PinOut Bild.
Am UNO kann ich Pin A1/ 15 High und Low programmieren, funktioniert tadellos.
auf dem Mega kann ich den Pin keine Reaktion abrufen.
Wo denke (mal wieder) falsch? oder ist das so?
Kann jemand diesen (vermeintlichen) Fehler reproduzieren? Habe 3 µC mit den selben Fehlerbild.

lieben Gruß Flötzinger

Ich kenne den ATmega88 nicht, vermute aber, du kannst die analogen Pins nicht als digitale verwenden. Das geht aber beim Atmega328, zumindest bei A0 - A5.
Weiteres findest du im Datenblatt.

werd ich checken, wobei mir gerade auffällt, dass zumindest die von mir benutzen Pins A0, A2 und A3 keine Probleme bereiten (noch nicht ...).
Danke!

Hallo,

etwas verwirrend geschrieben.

Uno steht für ATmega328P.
Mega steht für ATmega2560.

Schreibe bitte nur noch ATmega88PA oder ATmega328P o.ä.
Zwischen letzt genannten sollte es keine Unterschiede.

Beim ATmega2560 liegen diese Pins woanders auf dem Arduino Mega2560 Board. Aber die Arduino Bezeichnung ist gleich.

Digital funktioniert auf allen Pins. Nur analog ist eine Zusatzfunktion bei bestimmten Pins.

ok, verstanden.
hier meine ich den ATMega 88 PA, dessen Pinout mir hier in Paierform vorliegt (Download von Github.com).
Dort stehen sich die Pinbezeichnungen ja gegenüber, so dass man eigentlich nichts falsch machen kann.
Was mich nur verwundert, dass eben die Pins A0, A2 und A3 auf dem UNO (ATMega 328P) auch auf dem ATMega 88PA (hierzu siehe Pinout Bildchen) ohne Probleme funktionieren. Nur A1 nicht.

Im Datasheet finde ich zu den Pin keine"dieser Pin ist besonders/anders" Beschreibung.
"Port C (PC5:0)
Port C is a 7-bit bi-directional I/O port
with internal pull-up resistors (selected for each bit). The PC5...0 output
buffers have symmetrical drive
characteristics with both high sink and
source capability. As inputs, Port C pins
that are externally pulled low will source
current if the pull-up
resistors are activated. The Port C pins are tri-
stated when a reset condition becomes active, even if the clock is not running."

Wie bereits weiter oben geschrieben ist es PC1, um den as geht.

Bin jetzt erstmal auf PB7 (UNO= 21) umgestiegen, lüppt gut.

muss jetzt aber schon wieder los.
Bis Später und Danke für eure Mühen.

Hallo,

ich gehe von dem hier aus ... ? GitHub - MCUdude/MiniCore: Arduino hardware package for ATmega8, ATmega48, ATmega88, ATmega168, ATmega328 and ATmega328PB

Gehäusepinnummer und Arduinopinnummer verwechselst du nicht?
Welche Gehäuseform hat dein ATmega88PA ? Für den Fall der Fälle.

Die klassische Tour.
Alle Pins frei machen. Nur Gehäusepin 24 anklemmen.
Wenns nicht klappt alle anderen Pins durchprobieren. "Irgendeiner" muss takten.

Oder ist defekt? Boardfehler? Kontaktproblem?

#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))   // setzt das angegebene Bit auf 1
#endif
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))  // setzt (löscht) das angegebene Bit auf 0
#endif

#define pin_24_OUT  sbi (DDRC,1)  // PC1 Ausgang, Gehäusepin 24, Arduino Pinnummer 15
#define pin_24_ON   sbi (PORTC,1) // einschalten
#define pin_24_OFF  cbi (PORTC,1) // ausschalten


void setup()  {

  pin_24_OUT;    // Ausgänge setzen
             
}   // Ende setup


void loop()
{
  
  pin_24_ON;
  delay(1000);
  pin_24_OFF;
  delay(1000);
   
}