Probleme mit dem Pollin Evaluationsboard

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 28 9 2024  12:24:25      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte


Autor
Probleme mit dem Pollin Evaluationsboard

    







BID = 648754

Pipimaxi

Gelegenheitsposter



Beiträge: 82
Wohnort: Mörlenbach
ICQ Status  
 

  


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:


Code :


If (PA3 == 1)
do this;


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
ICQ Status  

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
ICQ Status  

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
ICQ Status  

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 ]


Zurück zur Seite 1 im Unterforum          Vorheriges Thema Nächstes Thema 


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 17 Beiträge im Durchschnitt pro Tag       heute wurden bisher 14 Beiträge verfasst
© x sparkkelsputz        Besucher : 182087974   Heute : 2454    Gestern : 6155    Online : 580        28.9.2024    12:24
8 Besucher in den letzten 60 Sekunden        alle 7.50 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0457770824432