Probleme mit dem Pollin Evaluationsboard Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte
Autor |
Probleme mit dem Pollin Evaluationsboard |
|
|
|
|
BID = 648754
Pipimaxi Gelegenheitsposter
 
Beiträge: 82 Wohnort: Mörlenbach
|
|
Hallo liebe Forengemeinde,
da ich nun als Elektrotechnikstudent in den Genuss der Mikroprozessorik gekommen bin, habe ich mir natürlich ein Board für daheim zum üben besorgt, das berühmte von Pollin mit dem Addon-Board zusammen.
So, das ganze System ist ja high-aktiv, also LED leuchtet, wenn Port auf high und genauso ist es mit Eingang, ergo äußere Beschaltung am Taster mit einem Pull-Down Widerstand.
Ah, sollte ich vll noch erwähnen: Überwiegend programmieren wir in C
Problem ist nun, dass die Tasterabfrage nicht funktioniert.
Code würde bsp-weise so lauten:
Code : |
DDRA = 0x00; //Port A sind alle Eingang
PORTA = 0x00; //interner PullUp deaktiviert,
Zeile kann man sich sparen, nur zur Verdeutlichung
while(PINA == 0x00);
/* Würed ja bedeuten, schleife wird erst dann beendet, wenn IRGENDEIN
Taster gedrückt wurde, weil dann ist der Wert ja nicht mehr 0x00*/
|
|
Leider funktioniert der Taster auf diese Weise nicht :-/
Generell würde ein "Taster" funktionieren wenn ich die Ports auf dem Board unbeschaltet lasse, die internen PullUps aktiviere und den Port auf Masse ziehe, wenn ich ich praktisch eine "Taste drücke"
Das Testtool programm von Pollin ist ja in Bascom geschrieben und dort wird auch eine Abfrage auf high-pegel gemacht, also in der art:
Nur in C funktioniert das irgendwie nicht
Über jede Hilfe wäre sich sehr dankbar!
Grüße
Markus
[ Diese Nachricht wurde geändert von: Pipimaxi am 18 Nov 2009 12:17 ] |
|
BID = 648815
DonComi Inventar
     
Beiträge: 8605 Wohnort: Amerika
|
|
Hallo Markus,
Welcher Controller und wie sieht der Rest des Codes aus?
Bist du dir mit PortA sicher?
Ich kann nicht nachgucken, keine Zeit und keine Lust .
_________________
|
|
BID = 648818
Pipimaxi Gelegenheitsposter
 
Beiträge: 82 Wohnort: Mörlenbach
|
Hallo DonComi,
als Controller benutz ich den ATmega 32
Der Code war praktisch nur ein Beispiel
Prinzipiell lager ich mir ja in C vieles in Funktionen aus, Portinitialisieren usw.
Und genauso hab ich eben eine Funktion waitforKey() die aufgerufen mir das Bitmuster des Ports zurück gibt.
Hier als Beispiel:
Code : |
void initPort()
{
DDRA = 0x00; //Eingabe für Taster
PORTA = 0x00; //Pullup-Widerstand deaktiviert
}
unsigned char waitforKey()
{
char TASTE;
while(PINA==0x00);
_delay_ms(100);
TASTE=PINA;
while(PINA!=0x00);
_delay_ms(100);
return TASTE;
} |
|
An Softwareentprellung wurde auch gedacht.
Auf dem Addon-Board kann ich mir ja aussuchen an welche Ports ich die Taster stecken will, sind ja Drahtbrücken
An der Uni benutzen wir das STK500, was selbst ja low-aktiv ist, also genau umgekehrt zum Pollin
Dort wird auch der interne PullUp aktiviert, also es funktioniert dort einwandfrei.
Nur bei meinem high-aktiven Pollin Board will das noch nicht so wie ich es will
|
BID = 648870
BjörnB Stammposter
    Beiträge: 242 Wohnort: Dortmund
|
Hallo,
hast Du in Deinem Fall daran gedacht, einen externen Pull-Down-Widerstand einzubauen?
Schöne Grüße,
Björn
|
BID = 648876
DonComi Inventar
     
Beiträge: 8605 Wohnort: Amerika
|
Wenn du die Taste weniger als 100ms gedrückt hälst, wird der Druck nicht registriert, also im Rückgabewert zurückgeliefert.
Es muss also irgendein blöder Fehler sein, z.B.:
* die Ports sind doch Low-aktiv,
* die Ports sind kaputt,
* du ließt den falschen Port...,
* du hast einen noch fundamentaleren Fehler drin, z.B. könnte es sein, dass die Warteschleife wegoptimiert wird...
* Prozessor läuft auch, ja? Also das Programm wird bestimmt für den richtigen Prozessor und die richtige Systemfrequenz übersetzt?
---
Zum Stil:
Konstanten schreibt man nach einer ungeschriebenen Regel GROSZ.
Variablenbezeichner schreibt man klein.
Wenn du als Rückgabetypen unsigned char festlegst, sollte die lokale Variable TASTE den gleichen Typen haben.
Eine Verbesserung wäre, den Taster zyklisch abzufragen wie jetzt, aber einen alten und einen aktuellen Wert mit XOR zu vergleichen. Gesetze Einsen im Resultat deuten auf einen gedrückten Taster hin.
Die Zeiten würde ich deutlich runtersetzen, am besten zyklisch in einem Timerinterrupt abfragen, oder bei weniger Tastern ext. Interrupts verwenden.
Hast du dir mal Disassembling angeschaut?
_________________
|
BID = 648877
DonComi Inventar
     
Beiträge: 8605 Wohnort: Amerika
|
@Björn:
Zitat :
|
wenn Port auf high und genauso ist es mit Eingang, ergo äußere Beschaltung am Taster mit einem Pull-Down Widerstand. |
Wer lesen kann...
_________________
|
BID = 648887
Pipimaxi Gelegenheitsposter
 
Beiträge: 82 Wohnort: Mörlenbach
|
Hallo
erstmal danke für eure Hilfsversuche
wie DonComi schon richtig andeutete und ich in meinem ersten Post auch, laut Datenblatt des Pollin-Boards is das komplette Board high-aktiv
ich füge mal den Code ein, der momentan auf dem atmega 32 rennt:
Code : |
#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 16000000
unsigned char waitforKey()
{
unsigned char taste;
while(PIND == 0x60);
_delay_ms(10);
taste=PIND;
while(PIND != 0x60);
_delay_ms(10);
return taste;
}
int main(void)
{
DDRD = 0x60;
PORTD = 0x60;
while(1)
{
if(waitforKey() != 0x60 && PORTB == 0x00)
{
PORTB=0x60;
_delay_ms(1000);
}
if(waitforKey() != 0x60 && PORTB == 0x60)
{
PORTB=0x00;
_delay_ms(1000);
}
}
return 1;
} |
|
Nach einem Reset leuchten die 2 LEDs auch wunderbar, nur egal welchen der 3 Taster ich drücke, es passiert nichts.
Lade ich das Testtool auf den atmega, funktioniert es einwandfrei
Also gehe ich von einem Defekt der Ports, der Taster oder low-aktive Methode nicht aus.
Das delay in der ausführung nach dem if habe ich mal reingemacht um zu schauen ob die LEDs vielleicht blinken, könnte ja sein, dass dadurch irgendein fehler sichtbar wird, aber nichts is :-/
Habe mal am atmega direkt gemessen an den Ports mit dem Multimeter, also wenn der Taster gedrückt wird kommen auch 5V am Pin an, somit DÜRFTE es eigentlich funktionieren :-/
Das Optimization wurde im AVR Studio für dieses Projekt schon deaktiviert.
Wenn ich eine Taste länger gedrückt halte, passiert ebenfalls nichts
Zu dem Interruptvorschlag: Da muss ich leider passen, kam in der Vorlesung noch nicht dran  steht aber auf dem Lehrplan xD
Irgendwie muss es ja auch so gehen
Grüße
Markus
|
BID = 648893
DonComi Inventar
     
Beiträge: 8605 Wohnort: Amerika
|
Redest du von den LEDn auf dem Addon-Board pder auf der Erweiterung?
Auf dem Board ansich (Version 2.0.1) sind die Taster auf PortD...
Außerdem vergleichst du hier nicht nur ein Bit nur für den Tasterstatus, sondern das ganze Register. Ist doch klar, dass das nicht klappt.
Du musst alle anderen unwichtigen Bits wegmaskieren (mit bitweisem UND) und erst dann kannst du abfragen, ob das Bit x gesetzt ist.
Hängt der Taster z.B. an PortD 5, dann lautet deine while-Schleife:
while( ! (PORTD & (1<<5));
oder aber
while(!(PORTD & 0x32));
Mit dem == wird das jedenfalls nichts.
_________________
[ Diese Nachricht wurde geändert von: DonComi am 18 Nov 2009 22:11 ]
|
BID = 648901
Pipimaxi Gelegenheitsposter
 
Beiträge: 82 Wohnort: Mörlenbach
|
OK, einige Fehler hab ich schonmal behoben, funktioniert zwar immernoch nicht, aber hätte dazu eine Frage:
Wenn an einem Beinchen, Pin als Eingang definiert ist und ein High anliegt, wird das dann nicht ins PINx-Register geschrieben?
|
BID = 648914
DonComi Inventar
     
Beiträge: 8605 Wohnort: Amerika
|
Doch.
Das PIN-Register wird synchronisiert mit dem Systemtakt.
Es kann also bis zu ein paar 10ns dauern, bis das Register geupdatet wird.
Also nicht zu schnell drücken  ...
while(PIND == 0x60);
Heißt ja:
solange im Register 01100000 steht, wartet er.
Ändert sich auch nur eines der Bits (es muss keine Taste sein, die gedrückt wird!) taugt diese Methode nichts mehr.
Da die LEDn am gleichen IO-Port hängen und das Schreiben des PORT-Registers eine Periodendauer des Systemtaktes später dazu führt, dass die korrespondierenden Bits im PIN-Register auch geändert werden, ist diese Methode nicht praktikabel.
Ich nannte oben schon eine: bitweises XOR.
Die XOR-Verknüpfung ist für sowas optimal.
Um z.B. deine beiden Taster abzufragen würdest du den alten mit dem neuen Wert xor-verknüpfen und die restlichen Bits zu 0 maskieren mit der UND-Verknüpfung des Komplements der Bits, die 0 werden sollen:
static uint8_t reg_alt;
uint8_t reg_neu = PIND & 0x60; /* alle Bits löschen, außer diejenigen, die die Tasterzustände beinhalten */
if(reg_neu ^ reg_alt)
{
/*Änderung eingetreten */
}
reg_alt = reg_neu;
Mach doch mal folgendes:
uint8_t get_key(void)
{
static uint8_t reg_alt;
uint8_t reg_neu = PIND & 0x60;
if(reg_alt ^ reg_neu) {
_delay_ms(10);
};
return (reg_alt=reg_neu);
}
Zusätzlich kannst du natürlich erstmal feststellen (XOR), ob ein Bit umgekippt ist. Wenn nein, gleich wieder die Funktion beenden. Wenn eine Änderung eingetreten ist, vergleichst du noch den alten Wert mit dem neuen, daraus kann man schließen, ob die Taste gedrückt oder losgelassen wurde.
Achja, Edit:
Zitat :
|
DDRD = 0x60;
PORTD = 0x60;
|
Das wird doch alles nichts!
Eingang definiert man mit einer 0 in DDR, nicht mit einer 1!
Ließ dir das Datenblatt, speziell den Teil IO-Ports durch, da ist alles haarklein beschrieben!
Damit hast du oben, völlig egal, welchen Zustand die Taster haben, ins PIND-Register 0x60 geschrieben (da die Pins als Ausgänge geschaltet sind!).
Ist doch klar, dass es so nicht klappt
Achja, wenn du mein Beispiel nutzen willst, ersetze ggfs. (bei Fehlermeldung) uint8_t durch unsigned char.
_________________
[ Diese Nachricht wurde geändert von: DonComi am 18 Nov 2009 23:50 ]
|
|
Zum Ersatzteileshop
Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum
Datenschutz
Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland
gerechnet auf die letzten 30 Tage haben wir 24 Beiträge im Durchschnitt pro Tag heute wurden bisher 3 Beiträge verfasst © x sparkkelsputz Besucher : 183091414 Heute : 3041 Gestern : 7954 Online : 209 20.2.2025 11:09 17 Besucher in den letzten 60 Sekunden alle 3.53 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
|
xcvb
ycvb
0.0442650318146
|