Hallo, ich habe mir eine einfach Schaltung mit einem Microkontroller gebaut. Relativ simpel. 4 Schalter 1 Rest Schalter ein 16.000 MHz Quarz mit 2pF Kondensaotren, ein LCD und das war's dann auch schon. Jetzt habe ich nur das Problem, dass der Mega 32 durch das ganze Programm springt, obwohl er kein Signal von einem Taster bekommt. Ich habe auch schon die Pins umgebogen, damit sie nicht mehr im Sockel sind. Das Ergebnis ist immer noch das Gleiche. Die Spannung habe ich von einem Schaltnetzteil. Von 12 V auf 5,02 V mit 7809 und 7805 Spannugsreglern herunter geholt und mit Elkos geglättet. Eine Brücke kann ich auch nirgends finden. 15 CM von meinem µC ist das Netzteil angebracht. Ist es möglich, dass dieses meinen Prozi aus dem Takt wirft? Solangsam gehen mir die Ideen aus. Gruß
ICH schrieb: > ein 16.000 MHz Quarz mit 2pF Kondensaotren, in der Regel braucht man 22pF und ohne eine einzige Zeile Programm oder Schaltplan wird dir auch niemand helfen können...
@Chris: Nein Zeile 666, "DER TEUFEL IST SCHULD, VERBENNT IHN". "Hä wen, den Teufel ?"
#include <avr/io.h>
#include <stdint.h>
#ifndef F_CPU
#warning "F_CPU war noch nicht definiert, wird nun mit 3686400
definiert"
#define F_CPU 8000000UL /* Quarz mit 8 Mhz */
#endif
#include <util/delay.h>
#include <stdlib.h>
#include "lcd-routines.h"
#include <string.h>
/*
* ==================================================== Entprellen
====================================================
*/
#define debounce( port, pin ) \
({ \
static uint8_t flag = 0; /* new variable on every macro usage */ \
uint8_t i = 0; \
\
if( flag ){ /* check for key release: */ \
for(;;){ /* loop... */ \
if( (port & 1<<pin) ){ /* ... until key pressed or ... */ \
i = 0; /* 0 = bounce */ \
break; \
} \
_delay_us( 98 ); /* * 256 = 25ms */ \
if( --i == 0 ){ /* ... until key >25ms released */ \
flag = 0; /* clear press flag */ \
i = 0; /* 0 = key release debounced */ \
break; \
} \
} \
}else{ /* else check for key press: */ \
for(;;){ /* loop ... */ \
if( !(port & 1<<pin) ){ /* ... until key released or ... */ \
i = 0; /* 0 = bounce */ \
break; \
} \
_delay_us( 98 ); /* * 256 = 25ms */ \
if( --i == 0 ){ /* ... until key >25ms pressed */ \
flag = 1; /* set press flag */ \
i = 1; /* 1 = key press debounced */ \
break; \
} \
} \
} \
i; /* return value of Macro */ \
})
/*
* ==================================================== Portzuweisungen
====================================================
*/
/*
* Port A Menusteuerung
*
* Port B \
* - Schnaepse / Magnetventile
* Port C /
*
* Port C Luftsteuerung (Druckluft / Entlueftung)
*
* Port D Display (siehe lcd-routines.c/h)
*/
/*
* Namen fuer Ports und Register
*/
// Taster
#define NavigationDirection DDRA // Richtungsregister
#define NavigationPort PORTA // Datenregister
#define NavigationIn PINA // Eingangsregister
// Magnetventile (Schnaps / Luftsteuerung)
#define Vent1Direction DDRB // Richtungsregister
#define Vent1Port PORTB // Datenregister
#define Vent1In PINB // Eingangsregister
#define Vent2Direction DDRC // Richtungsregister
#define Vent2Port PORTC // Datenregister
#define Vent2In PINC // Eingangsregister
/*
* Taster fuer Menunavigation
* alle active high
* Eingaenge
*/
#define menDown PA0 // eins nach unten
#define menUp PA1 // eins nach oben
#define menEnter PA2 // enter / bestaetigen
#define menBack PA3 // zurueck / abbrechen
#define menReset PA4 // CPU reset
/*
* Zutaten (Schnaepse) bzw. zugehoerige Magnetventile
* Ausgaenge
*/
#define Gin (1 << PB0) // Gin
#define Rum (1 << PB1) // Rum
#define Vodka (1 << PB2) // Vodka
#define Tequila (1 << PB3) // Tequila
#define Zitronensaft (1 << PB4) // Zitronensaft
#define Orangensaft (1 << PB5) // Orangensaft
#define TripleSec (1 << PB6) // TripleSec
#define Cola1 (1 << PB7) // Cola
#define Cola2 (1 << PC0) // Cola
#define Cola3 (1 << PC1) // Cola
/*
* Luftsteuerung
* Ausgaenge
*/
#define blast (1 << PC5) // Ventil fuer Druckluft
#define aeration (1 << PC6) // Ventil fuer Belueftung
#define vent (1 << PC7) // Ventil fuer Entlueftung
/*
* ==================================================== Glasgroessen
====================================================
*/
/*
* Glasgroessen
*/
#define small 4 // kleines Glas, 100 ml
#define medium 2 // mittelgrosses Glas, 200 ml
#define big 1 // grosses Glas, 400 ml
// aktuelle Glasgroesse
uint8_t glassSize = big;
/*
* ==================================================== Durchlaufzeiten
====================================================
*/
/*
* Durchlaufzeit fuer 2cl in ms
*/
#define runTime 2000
/*
* Pufferzeit, damit Ventile schalten koennen
*/
#define pufferTime 500
/*
* ==================================================== Cocktails
====================================================
*/
/*
* Cocktails
* jeder int steht fuer die Anzahl an 1cl-Portitionen der jeweiligen
Zutat
* Bsp.: gin = 2 ==> 2 * 1cl Gin = 2cl Gin
*/
typedef struct {
uint8_t gin; // Gin
uint8_t rum; // Rum
uint8_t vodka; // Vodka
uint8_t tequila; // Tequila
uint8_t zitrone; // Zitronensaft
uint8_t orange; // Orangensaft
uint8_t tripleSec; // TripleSec
uint8_t cola; // Cola
} cocktail;
/*
* Long Island Iced Tea
*/
cocktail longIslandIcedTea = {2, 2, 2, 2, 2, 4, 2, 10};
/*
* Vodka-O
*/
cocktail vodkaO = {0, 0, 4, 0, 0, 16, 0, 0};
/*
* Vodka-Cola
*/
cocktail vodkaCola = {0, 0, 4, 0, 0, 0, 16};
/*
* ==================================================== Menueintraege
====================================================
*/
/*
* Menue-Eintrag
* fuer Menubasierte Steuerung
*
* subMenu != NULL && parMenu == NULL ->
Top-Level-Eintrag
* subMenu == NULL && parMenu != NULL && glassSz > 0 ->
Glassgroesse-Eintrag
* subMenu == NULL && parMenu != NULL && glassSz = 0 && drink != NULL
-> Cocktail-Eintrag
* subMenu == NULL && parMenu != NULl && glassSz = 0 && drink == NULL
-> Impressum-Eintrag
*/
struct menuPoint {
struct menuPoint *parMenu; // uebergeordneter Menuepunkt; NULL, falls
keiner existiert
struct menuPoint *subMenu; // Untermenue; NULL, falls keines existiert
struct menuPoint *prev; // vorheriger Menueeintrag
struct menuPoint *next; // naechster Menueeintrag
uint8_t glassSz; // Glasgroesse
cocktail *drink; // LowByte - Port B; HighByte - Port C
char line1[17]; // Titel des Eintrags - Zeile 1
char line2[17]; // Titel des Eintrags - Zeile 2
};
/*
* ==================================================== Programm
====================================================
*/
/*
* Entprell-Methoden, um Entprellung an mehreren Stellen aufrufen zu
koennen
*/
// nach-unten-Taster
uint8_t debounce_Down(void) {
return debounce(NavigationIn, menDown);
}
// nach-oben-Taster
uint8_t debounce_Up(void) {
return debounce(NavigationIn, menUp);
}
// enter-Taster
uint8_t debounce_Enter(void) {
return debounce(NavigationIn, menEnter);
}
// zurueck-Taster
uint8_t debounce_Back(void) {
return debounce(NavigationIn, menBack);
}
// Reset-Taster
uint8_t debounce_Reset(void) {
return debounce(NavigationIn, menReset);
}
/*
* Methode zur Initalisierung des Menues
* gibt Pointer zu erstem Top-Level-Eintrag zurueck
*/
struct menuPoint *initMenu() {
// Hauptmenue
struct menuPoint *tlMenu = (struct menuPoint *) malloc(3 *
sizeof(struct menuPoint));
// Menue zum Einstellen der Glasgroesse
struct menuPoint *glassSizeMenu = (struct menuPoint *) malloc(3 *
sizeof(struct menuPoint));
// Menue zur Cocktailauswahl
struct menuPoint *cocktailMenu = (struct menuPoint *) malloc(3 *
sizeof(struct menuPoint));
// Menue Impressum
struct menuPoint *imprint = (struct menuPoint *) malloc(sizeof(struct
menuPoint));
/*
* Glasgroesse
*/
// kleines Glas
glassSizeMenu[0].parMenu = tlMenu;
glassSizeMenu[0].subMenu = NULL;
glassSizeMenu[0].prev = &glassSizeMenu[2];
glassSizeMenu[0].next = &glassSizeMenu[1];
glassSizeMenu[0].glassSz = small;
glassSizeMenu[0].drink = NULL;
strcpy(glassSizeMenu[0].line1, "klein");
strcpy(glassSizeMenu[0].line2, "100ml");
// mittelgrosses Glas
glassSizeMenu[1].parMenu = tlMenu;
glassSizeMenu[1].subMenu = NULL;
glassSizeMenu[1].prev = &glassSizeMenu[0];
glassSizeMenu[1].next = &glassSizeMenu[2];
glassSizeMenu[1].glassSz = medium;
glassSizeMenu[1].drink = NULL;
strcpy(glassSizeMenu[1].line1, "mittel");
strcpy(glassSizeMenu[1].line2, "200ml");
// grosses Glas
glassSizeMenu[2].parMenu = tlMenu;
glassSizeMenu[2].subMenu = NULL;
glassSizeMenu[2].prev = &glassSizeMenu[1];
glassSizeMenu[2].next = &glassSizeMenu[0];
glassSizeMenu[2].glassSz = big;
glassSizeMenu[2].drink = NULL;
strcpy(glassSizeMenu[2].line1, "gross");
strcpy(glassSizeMenu[2].line2, "400ml");
/*
* Cocktails
*/
// Long Island Iced Tea
cocktailMenu[0].parMenu = tlMenu;
cocktailMenu[0].subMenu = NULL;
cocktailMenu[0].prev = &cocktailMenu[2];
cocktailMenu[0].next = &cocktailMenu[1];
cocktailMenu[0].glassSz = 0;
cocktailMenu[0].drink = &longIslandIcedTea;
strcpy(cocktailMenu[0].line1, "Long Island");
strcpy(cocktailMenu[0].line2, " Iced Tea");
// Vodka-O
cocktailMenu[1].parMenu = tlMenu;
cocktailMenu[1].subMenu = NULL;
cocktailMenu[1].prev = &cocktailMenu[0];
cocktailMenu[1].next = &cocktailMenu[2];
cocktailMenu[1].glassSz = 0;
cocktailMenu[1].drink = &vodkaO;
strcpy(cocktailMenu[1].line1, "Vodka +");
strcpy(cocktailMenu[1].line2, " Orangensaft");
// Vodka-Cola
cocktailMenu[2].parMenu = tlMenu;
cocktailMenu[2].subMenu = NULL;
cocktailMenu[2].prev = &cocktailMenu[1];
cocktailMenu[2].next = &cocktailMenu[0];
cocktailMenu[2].glassSz = 0;
cocktailMenu[2].drink = &vodkaCola;
strcpy(cocktailMenu[2].line1, "Vodka +");
strcpy(cocktailMenu[2].line2, " Cola");
/*
* Impressum
*/
imprint[0].parMenu = tlMenu;
imprint[0].subMenu = NULL;
imprint[0].prev = imprint;
imprint[0].next = imprint;
imprint[0].glassSz = 0;
imprint[0].drink = NULL;
strcpy(imprint[0].line1, "Harald Weing");
strcpy(imprint[0].line2, "Matthias Weing");
/*
* Hauptmenue
*/
// Glasgroesse
tlMenu[0].parMenu = NULL;
tlMenu[0].subMenu = glassSizeMenu;
tlMenu[0].prev = &tlMenu[2];
tlMenu[0].next = &tlMenu[1];
tlMenu[0].glassSz = 0;
tlMenu[0].drink = NULL;
strcpy(tlMenu[0].line1, "Glasgroesse");
strcpy(tlMenu[0].line2, "einstellen");
// Cocktails
tlMenu[1].parMenu = NULL;
tlMenu[1].subMenu = cocktailMenu;
tlMenu[1].prev = &tlMenu[0];
tlMenu[1].next = &tlMenu[2];
tlMenu[1].glassSz = 0;
tlMenu[1].drink = NULL;
strcpy(tlMenu[1].line1, "Cocktail");
strcpy(tlMenu[1].line2, "waehlen");
// Impressum
tlMenu[2].parMenu = NULL;
tlMenu[2].subMenu = imprint;
tlMenu[2].prev = &tlMenu[1];
tlMenu[2].next = &tlMenu[0];
tlMenu[2].glassSz = 0;
tlMenu[2].drink = NULL;
strcpy(tlMenu[2].line1, "Impressum");
strcpy(tlMenu[2].line2, "anzeigen");
return tlMenu;
}
/*
* Methode zum mischen der Cocktails
* schreibt Mischungen auf entsprechende Ports, oeffnet und schliesst
also die Ventile
*
* Ablauf:
* (1) Pressluft auf, Entlueftung auf, Belueftung zu
* (2) Zutaten reinlaufen lassen - jede Kammer hat 2cl
Fassungsvermoegen!
* (3) Pressluft zu, Entlueftung zu, Belueftung auf (laesst Zutaten
von Mischer in Glas laufen)
* (4) Falls noch mehr Zutaten von einer Sorte (> 2cl), weiter bei (1)
* (5) Pressluft auf, Entlueftung zu, Belueftung zu (fertig mit
Mischen)
*/
void mixDrink(cocktail *drink) {
// letzte verwendete Cola-Zufuhr (fuer moeglichst gleichmaeßigen
Verbrauch)
// 0 = Cola1, 1 = Cola2, 2 = Cola3
static uint8_t lastCoke = 0;
// drink kopieren
uint8_t gin = drink->gin; // Gin
uint8_t rum = drink->rum; // Rum
uint8_t vodka = drink->vodka; // Vodka
uint8_t tequila = drink->tequila; // Tequila
uint8_t zitrone = drink->zitrone; // Zitronensaft
uint8_t orange = drink->orange; // Orangensaft
uint8_t tripleSec = drink->tripleSec; // TripleSec
uint8_t cola = drink->cola; // Cola
// temporaere Masken fuer Ventile, damit Schnaepse gleichzeitig
loslaufen koennen
uint8_t vent1;
uint8_t vent2;
while ((gin > 0) | (rum > 0) | (vodka > 0) | (tequila > 0) | (zitrone
> 0) | (orange > 0) | (tripleSec > 0) | (cola > 0)) {
// temporare Masken zuruecksetzen
vent1 = 0;
vent2 = 0;
// noch nicht fertig gemixt
// pressluft auf, entlueftung auf, belueftung zu
vent2 = blast | vent;
vent2 &= ~aeration;
Vent2Port |= vent2;
// vent2 zuruecksetzen
vent2 = 0;
// Ventilen Zeit geben, um zu schalten
_delay_ms(pufferTime);
// Zutaten reinlaufen lassen, pro Intervall skaliert ueber
Glasgroesse "2cl"
// Restrgroessen gleich mit anpassen
if (gin) {
vent1 |= Gin;
gin -= 2;
}
if (rum) {
vent1 |= Rum;
rum -= 2;
}
if (vodka) {
vent1 |= Vodka;
vodka -= 2;
}
if (tequila) {
vent1 |= Tequila;
tequila -= 2;
}
if (zitrone) {
vent1 |= Zitronensaft;
zitrone -= 2;
}
if (orange) {
vent1 |= Orangensaft;
orange -= 2;
}
if (tripleSec) {
vent1 |= TripleSec;
tripleSec -= 2;
}
// Spzialfall Cola
if (cola >= 6) {
// alle drei Behaelter laufen lassen
vent1 |= Cola1;
vent2 |= Cola2 | Cola3;
cola -= 6;
} else if (cola >= 4) {
// die beiden zuletzt nicht benutzen Cola-Behaelter laufen lassen
if (lastCoke == 0) {
vent2 |= Cola2 | Cola3;
} else if (lastCoke == 1) {
vent1 |= Cola1;
vent2 |= Cola3;
} else {
vent1 |= Cola1;
vent2 |= Cola2;
}
cola -= 4;
// letzen verwendeten Behaelter anpassen
lastCoke++;
lastCoke %= 3;
} else {
// naechsten nicht benutzen Cola-Behaelter laufen lassen
if (lastCoke == 0) {
vent2 |= Cola2;
} else if (lastCoke == 1) {
vent2 |= Cola3;
} else {
vent1 |= Cola1;
}
cola -= 2;
// letzten verwendeten Behaelter anpassen
lastCoke++;
lastCoke %= 3;
}
// Ventile oeffnen -> in Mischbehaelter laufen lassen
Vent1Port = vent1;
Vent2Port |= vent2;
// warten, bis Schnaps durchgelaufen ist
_delay_ms(runTime / glassSize);
// Ventile schliessen -> Schnaps in Mischbehaelter
Vent1Port = 0;
Vent2Port &= ~vent2;
// Ventile schliessen lassen
_delay_ms(pufferTime);
// vent2 zureucksetzen
vent2 = 0;
// Mischbehaelter nach unten oeffnen -> Gemisch in Glas
Vent2Port = aeration;
// Zeit geben zum durchlaufen lassen
_delay_ms(5 * runTime);
}
// Anfangszustand wiederherstellen (Nur Pressluft offen)
Vent2Port = blast;
// Ventile schalten lassen
_delay_ms(pufferTime);
}
/*
* main-Methode
*/
int main(void) {
// Richtungsregister fuer Taster setzen (alle Pins als Eingang)
NavigationDirection = 0;
// Eventuell aktive Pull-Up-Widerstaende ausschalten
NavigationPort = 0;
// Richtungsregister fuer Ventile setzen
Vent1Direction = Gin | Rum | Vodka | Tequila | Zitronensaft |
Orangensaft | TripleSec | Cola1;
Vent2Direction = Cola2 | Cola3 | blast | aeration | vent;
// alle Ventile zu machen
Vent1Port = 0;
Vent2Port = blast; // Pressluft muss am Anfang anliegen
// Menue initialisieren - aktueller Menue-Eintrag
struct menuPoint *current = initMenu();
// Initialisierung des LCD
// Nach der Initialisierung müssen auf dem LCD vorhandene schwarze
Balken
// verschwunden sein
lcd_init();
// Text des ersten Mneu-Eintrags auf Display schreiben
lcd_string(current->line1);
lcd_setcursor(0,2);
lcd_string(current->line2);
// wenn navigiert wurde, dann Display neu beschreiben lassen
uint8_t redraw = 0;
while(1) {
if (debounce_Down()) {
// einen Menuepunkt nach unten
current = current->next;
redraw++;
} else if (debounce_Up()) {
// einen Menuepunkt nach oben
current = current->prev;
redraw++;
} else if (debounce_Enter()) {
// Eintrag waehlen / in Menue absteigen
if (current->subMenu) {
// Untermenue existiert -> absteigen
current = current->subMenu;
redraw++;
} else {
// auf jeden fall kein Untermenue -> Aktion feststellen
if (current->glassSz) {
// ist Glassgroesse aendern -> mach das
glassSize = current->glassSz;
// zurueck zu uebergeordnetem Menue
current = current->parMenu;
redraw++;
} else {
// kein Glassgroessen-Eintrag
if (current->drink) {
// ist Cocktail-Eintrag -> Cocktail mischen
mixDrink(current->drink);
// zurueck zu uebergeordnetem Menue
current = current->parMenu;
redraw++;
} else {
// Impressum-Eintrag -> zurueck zu uebergeordnetem Menu
current = current->parMenu;
redraw++;
}
}
}
} else if (debounce_Back()){
// eine Menue-Ebene nach oben / zurueck, falls nicht schon ganz
oben
if (current->parMenu) {
// ist nicht Top-Level-Eintrag
current = current->parMenu;
}
// sonst: nix machen
} else if (debounce_Reset()) {
// wird hardwareseitig gemacht
} else {
// leere Anweisung, kein Event
;
}
if (redraw) {
// aktueller Menue-Eintrag (current) veraendert -> Display neu
beschreiben
lcd_clear();
lcd_setcursor(0,1);
lcd_string(current->line1);
lcd_setcursor(0,2);
lcd_string(current->line2);
// redraw wieder auf 0 setzen, wenn nix veraendert wird, nix
zeichnen
redraw = 0;
}
}
return 0;
}
Floh schrieb: > ICH schrieb: >> 4 Schalter > > wie verschaltet? Von +5 V auf über den Taster auf den Pin. Entprellt werden sie im µC
ICH schrieb: >Von +5 V auf über den Taster auf den Pin. >Entprellt werden sie im µC Fehlender Pull-Down Widerstand an den Pins?! Wenn die keinen definierten Pegel haben könnten sie schalten wie sie lustig sind
>Jetzt habe ich nur das Problem, dass der Mega 32 durch das ganze >Programm springt Das ist sein Job!
Du machst aus 12 Volt --> +5V(7805) & -5V(7905)? Vielleicht hast du ein Masseproblem, Schaltplan könnte helfen.
Im Code ist F_CPU auf 8Mhz gesetzt, im Eingangspost schreibst Du etwas von 16 Mhz. Mach mal weniger Defines. Die kann der Compiler nicht prüfen. Bekommst Du Warnungen beim Compilieren? Das Debounce sieht etwas merkwürdig aus... Abblockkondensatoren verwendet?
Ach noch etwas, 16.000 Mhz sind etwas zuviel. 16 Mhz würden reichen, außerdem steht im Programm etwas von 8 Mhz. ;-)
Kevin schrieb: > Du machst aus 12 Volt --> +5V(7805) & -5V(7905)? > Vielleicht hast du ein Masseproblem, Schaltplan könnte helfen. Nein, ich mache nur +5 V ich habe nirgendwo ein negative Potential.
Pete K. schrieb: > Im Code ist F_CPU auf 8Mhz gesetzt, im Eingangspost schreibst Du etwas > von 16 Mhz. > > Mach mal weniger Defines. Die kann der Compiler nicht prüfen. Bekommst > Du Warnungen beim Compilieren? > > Das Debounce sieht etwas merkwürdig aus... > > Abblockkondensatoren verwendet? Das mit den 16Mhz steht jetzt auch im Code. Wohin müssen die Abblockkondensatoren? vor den Pin des Schalters?
ICH schrieb: > Ich habe auch schon die Pins umgebogen, damit sie nicht mehr im Sockel > sind. Und wie soll dann der Pegel für "nicht gedrückt" ankommen??? Ein Pin nur als Antenne beschaltet, kann beliebigen Pegel haben. Peter
ICH schrieb: > Jetzt habe ich nur das Problem, dass der Mega 32 durch das ganze > Programm springt, Kannst Du das näher beschreiben? ICH schrieb: > obwohl er kein Signal von einem Taster bekommt. Doch. Bei fehlenden Pulldown Widerständen können, wie bereits von Lars angemerkt, sehr wohl "Tastendrücke" erkannt werden, auch wenn kein Taster betätigt wird.
J.-u. G. schrieb: >> Jetzt habe ich nur das Problem, dass der Mega 32 durch das ganze >> Programm springt, > > Kannst Du das näher beschreiben? Ich lege Spannung an, und kann am LCD zuschauen, wie er schön durch das Menü springt und dann sich einen Menüpunkt aussucht und dann dort stehen bleibt.
Frag Dich einfach mal, warum die meisten den internen Pullup einschalten und den Taster gegen GND. Peter
Ist es entsceident, ob ich 10kOhm oder 8 kOhm als Pulldown verwende? Als Abblockkondensator sind 100V 100µF ausreichend?
10k oder 8k ist egal. 100uF ist zu groß 100nF ist da eher ein vernüftiger Wert
Es sind 12 pF verbaut, beim Quarz, ist das extrem schlimm, wenn da keine 22 pF dran hängen?
ICH schrieb: > Es sind 12 pF verbaut, beim Quarz, ist das extrem schlimm, wenn da keine > 22 pF dran hängen? 2 x 12pF am Quartz sind auch in Ordnung.
Hey, nachdem ich Pull-Down Widerstände und Abblock Kerko eingebuat habe funktioniert es jetzt sehr schön. Vielen Dank an eure schnelle und gute Hilfe. Ich melde mich, wenn es weiter Probleme gibt. Gruß
Allgemein hilft es, sich bei der Beschaltung eng an die Datenblätter zu halten. Das ist manchmal etwas mühsam und löst auch nicht alle Probleme, aber 90% der Fehler kann man da wahrscheinlich mit erschlagen.
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.