mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Eingänge PORTC Probleme beim Atmega8


Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo, ich habe folgendes problem und bin momentan mit meinem latein am 
ende. weiß nich woran das liegt. ich habe eine tastatur(0 bis 9 und 
Stern und Raute) an PortB und PortC angeschlossen. PortB und PortC 
jeweils 6 Pins, also passt. nun aber das problem. die letzten 3 Pins 
also vom PortC kann ich nicht ansprechen! siehe programmcode... PortB 
klappt alles perfekt aber bei PortC klappt das mit der 9, Stern und 
Rautetaste nicht. Hat jemand eine Idee? wäre sehr dankbar



switch(port_b)
{
case 0xFE: pw_org[counter]='0'; counter++; break;
case 0xFD: pw_org[counter]='1'; counter++; break;
case 0xFB: pw_org[counter]='2'; counter++; break;
case 0xF7: pw_org[counter]='3'; counter++; break;
case 0xEF: pw_org[counter]='4'; counter++; break;
case 0xDF: pw_org[counter]='5'; counter++; break;
}

switch(port_c)
{
case 0x3E: pw_org[counter]='6'; counter++; break;
case 0x3D: pw_org[counter]='7'; counter++; break;
case 0x3B: pw_org[counter]='8'; counter++; break;
case 0x37: pw_org[counter]='9'; counter++; break;
case 0x2F: goto j_set_pw; //ABGEBROCHEN
break;
case 0x1F: var=0; break;

Autor: Toni (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

bin mir nicht ganz sicher was den ATMega8 angeht.

Aber schau mal ins Datenblatt. Soweit ich mich erinnern kann sind dort 
nur die Pins PC0 bis PC5 verfügbar.


Gruß

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Toni wrote:
> Aber schau mal ins Datenblatt. Soweit ich mich erinnern kann sind dort
> nur die Pins PC0 bis PC5 verfügbar.
Und? Sind doch 6 Stück, genau wie er schreibt... Das Problem liegt eher 
in seiner Auswertung.

@Andreas:
Du musst die Pins einzeln maskieren. So wie Du das machst, wird das 
nichts. Schau mal z.B. unter Bitmanipulation.

Das Problem liegt vermutlich hauptsächlich darin, dass Port C nicht 
komplett zur Verfügung stehen, und dementsprechend die nicht vorhandenen 
Pins undefinierte Zustände zurückliefern. Du nimmst diese nicht 
vorhandenen Bits in der Abfrage anscheinend leichtfertigerweise als '0' 
an (zumindest geht aus dem Codeschnipsel nichts anderes hervor), was 
aber nicht unbedingt der Realität entsprechen muss. Wenn Du es schon mit 
einer switch...case-Abfrage machen willst, dann maskiere vorher die 
beiden höchstwertigen Bits aus (also setze sie definiert auf Null). Nur 
dann kann die Abfrage überhaupt funktionieren.

Allerdings kann die ganze Geschichte natürlich nur funktionieren, wenn 
nicht mehr als eine Taste an einem Port betätigt wurde.

EDIT:
ohlala, ich sehe da grad noch was, was überhaupt nicht gut ist:
> case 0x2F: goto j_set_pw; //ABGEBROCHEN
Verwende kein goto, erst recht nicht in einem solchen Konstrukt! Ich 
vermute mal, dass da irgendwohin gesprungen wird aber nicht wieder 
zurück. Das wird möglicherweise Stacksalat geben, je nachdem, wie der 
Rest aussieht. Also BITTEBITTEBITTE kein goto in C-Programmen! Es 
gibt nur einige ganz wenige exotische Anwendungsfälle dafür, die in 
Deinem Programm mit größter Wahrscheinlichkeit nicht auftreten.

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
okay ich danke dir erstmal...
das mit dem goto werd ich nochmal überdenken, da wird sich was besseres 
finden.
was das maskieren angeht, hast du natürlich recht.

so, ich hab dann mal ein kleines testprogramm geschrieben.. (an PORTD 
hängen LEDs)

#define   F_CPU 3686400
#include  <avr\io.h>

main()
{
    DDRC = 0x00;
    DDRB = 0x00;
    DDRD = 0xFF;

    PORTD = 0x00;
    PORTC = 0xFF;
    PORTB = 0xFF;
    int port_b=0xFF;
    int port_c=0xFF;
    int b=0xFF;
    int c=0xFF;

do
{
  port_b=0xFF;
  port_c=0xFF;

  do
  {
   port_b=PINB;
   port_c=PINC;
  }while(((port_b==0xFF)&&(port_c==0x3F)));

  do
  {
   b=port_b;
   c=port_c;
  }while(((b==PINB))&&((c==PINC)));

   port_c=port_c & 0b00111111;

   switch(port_c)
   {
    case 0x1F:PORTD=0xFF;  break;
   }
} while (true);


allerdings funktioniert es hier auch nich, eigentlich sollten die LEDs 
aber leuchten...oder seh ich da was falsch?
danke schonmal ;)

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Also BITTEBITTEBITTE kein goto in C-Programmen"

jaja, das hört man immer wieder, dennoch setze ich es hin und wieder 
ein. Ganz ohne Gewissensbisse - nur dass "man es nicht macht" ist für 
mich kein Grund, es nicht zu tun. Die Sprache sieht es vor, und es 
vereinfacht manche Sachen erheblich. Natürlich geht es ohne, es geht 
aber auch ohne viele andere Sachen. Und ein break ist letztenendes auch 
nichts anderes.
Ich will mit meiner Software keinen Schönheitspreis gewinnen, sie soll 
sicher funktionieren und den Umständen angemessen schnell genug sein, 
nebenbei mit dem zur Verfügung stehenden Platz auskommen. Und ewig Zeit 
zum Schönfeilen habe ich auch nicht, wird zumindest nicht bezahlt. Das 
sind meine Anforderungen, und wenn ich in einer grösseren Funktion 
mehrere Fehlermöglichkeiten habe, gibts in der Funktion mehrere goto 
error!

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
crazy horse wrote:
> "Also BITTEBITTEBITTE kein goto in C-Programmen"
>
> jaja, das hört man immer wieder, dennoch setze ich es hin und wieder
> ein. Ganz ohne Gewissensbisse - nur dass "man es nicht macht" ist für
> mich kein Grund, es nicht zu tun.
Du kannst ja machen, was Du willst, aber erzähle hier keinem "Newbie", 
er solle ohne weiteres goto verwenden! goto hat im Normalfall in einer 
Hochsprache, deren großer Vorteil die Möglichkeit der strukturierten 
Programmierung ist, nichts verloren, und da kannst auch Du nichts dran 
ändern! goto macht nämlich genau diesen großen Vorteil zunichte.

> Die Sprache sieht es vor, [...]
...und selbst die Erfinder von C raten zu allergrößter Vorsicht bei der 
Verwendung und sagen, dass goto fast immer vermeidbar ist!

> [...] und es vereinfacht manche Sachen erheblich.
Aber nicht die Dinge, die die Vorteile eines C-Programms unter anderem 
ausmachen, nämlich Lesbarkeit und Wartung!

Autor: Stefanie B. (sbs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Lesbarkeit und Wartung!
 in Verbindung mit C ist auch so ein Spezialfall ;-)

...

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
okay leute, wie gesagt, das mit dem goto werd ich noch ausbessern...
die frage ist immernoch: WIESO geht das zuletzt gepostete programm 
nicht?
die ich habe schon getestet ob, wenn man die taste drückt, durch diese
do
  {
   port_b=PINB;
   port_c=PINC;
  }while(((port_b==0xFF)&&(port_c==0x3F)));

  do
  {
   b=port_b;
   c=port_c;
  }while(((b==PINB))&&((c==PINC)));

Schleifen kommt, das geht...
Das Problem ist, dass ich nicht weiß, was genau in der variable port_c 
steht.
könnte mir das jemand erklären bitte...
dankeschön ;)

Autor: mehrfacher STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Das Problem ist, dass ich nicht weiß, was genau in der variable port_c
>steht.

In port_c kann jeder Wert stehen, wenn an Port B eine Taste gedrückt 
wurde.
Die Wahrscheinlichkeit ist aber sehr hoch, dass in diesem Fall immer 
noch 0x3F in der Variablen steht.
Wenn an Port C eine Taste gedrückt wurde, steht in port_c nicht mehr 
0x3F.

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
genau, ich hab ja auch schon rausgefunden, dass in port_c nicht mehr 
0x3F steht, wenn ich die taste drücke...
nur weiss ich eben nicht, wie ich rausfinden kann, was denn nun in 
port_c drin steht... :( bin echt am verzweifeln

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas wrote:
> genau, ich hab ja auch schon rausgefunden, dass in port_c nicht mehr
> 0x3F steht, wenn ich die taste drücke...
> nur weiss ich eben nicht, wie ich rausfinden kann, was denn nun in
> port_c drin steht... :( bin echt am verzweifeln
Nanana, nicht verzweifeln... Gib doch einfach den Wert von port_c an 
Port D aus, oder ist das ein so großes Problem?

Autor: mehrfacher STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>nur weiss ich eben nicht, wie ich rausfinden kann, was denn nun in
>port_c drin steht... :( bin echt am verzweifeln

Du könntest bitweise die Variable "zerlegen".
Dazu gibt es in C dieses Konstrukt: (1<<n), wobei n die Anzahl der 
Verschiebungen der 1 angibt (nichts anderes als ein Exponent).

Wenn du also testen willst, ob Bit 4 gesetzt ist, dann sieht das so aus:

if (port_c & (1<<4)) //Bit vier ist gesetzt
Mit etwas bool'scher Logik kann man dann auch den entgegengesetzten Fall 
prüfen.
Mehr dazu steht bestimmt in AVR-GCC-Tutorium...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail ü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
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
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 bestätigst du, die Nutzungsbedingungen anzuerkennen.