atmega644p - Welche Pins können als I/O benutzt werden?

OP #1294996
hallo,
ich arbeite gerade an meinem 4x4x4 Led Cube. Dafür hätte ich gerne 20 
Pins des Atmega. Nach langem hin und her funktioniert alles bis auf 
einen Pin (PC1);
Folgen Pins hab ich aus gelassen: PA4, PA5, PB3, PB4, PC0.

DDRX und PORTX sind deshalt so definiert worden.
//DDXY   76543210
DDRA  = b11001111;
PORTA = b00000000;
DDRB  = b11100111;
PORTB = b00000000;
DDRC  = b11111110;
PORTC = b00000000;
DDRD  = b11100011; //taster auch als eingang...
PORTD = b00000000;

Wenn ich jetzt Testweise alle Leds an schalte, scheint alles zu 
funktionieren.

////////////////////
//Testpattern
///////////////////
PORTA |= b11001111;
PORTB |= b11100111;
PORTC |= b11111110;
PORTD |= b01100011;
_delay_ms(2000);
PORTA = b00000000;
PORTB = b00000000;
PORTC = b00000000;
PORTD = b00000000;

Aber wenn ich jede led hintereinander einzel durch schalte, geht der 
besagt PC1 nicht.
Lustig ist auch dass wenn man beim anschalten der jeweiligen led 
zusätzlich noch andere Pins(also die welche ich eig. aus lasse) durch 
schaltet, dann ein anderer pin (PA3) nicht mehr schaltet. PC1 dann 
jedoch schon!
Ich würde ja mit schieberegistern arbeiten, nur ergeben sich daraus 
wieder erhebliche timing schwierigkeiten beim dimmen der leds. deshalb 
liegt mir bei der led cube größe noch eine lösung ohne schieberigstern 
am herzen.
Kann mir bitte jemand sagen wie man die Register richtig definiert um so 
viele pins wie möglich für I/O funktionen bereit zu stellen?!
OP
ja also das JTAGEN ist auf 1 in der hfuse;
nur SPIEN ist auf 0; (Brauch ich das nicht eig. für das programmieren 
über ISP) da kenn ich mich jetzt leider zu wenig aus;
JTAGEN müsst ich ja einfach aus machen können oder?
Moderator Persönliche Seite
p.s.: Ich denke, du hast irgendein Hardware-Problem.  Entweder eine
Zinnbrücke oder sowas, oder aber dein AVR ist kaputt.  Ich hatte
letztens auch einen ATmega88, dessen SDA-Leitung es geschafft hatte,
intern im AVR auf einen Widerstand von ca. 2 Ω zu kommen.  Alles
funktionierte noch, nur beim TWI blieb er beim Warten auf das Ende
der Startbedingung in der Software hängen. :-/
OP
naja das was mich stutzig macht ist dass je nachdem was ich für PORTX 
Und DDRX`s mache, und dann vor dem eig. testprog. noch alle unbenutzen 
ports auf 1 schalte, ein mal der eine pin nicht geht, und ein mal der 
andere nicht.
Also schalten können beide. damit schließe ich ein hardware problem eig. 
aus?!
darf ich eig. auf PORTD ein komplettes byte schreiben, wenn da doch 3 
pins als eingang definiert worden sind?
Moderator Persönliche Seite
E. B. schrieb:
> naja das was mich stutzig macht ist dass je nachdem was ich für PORTX
> Und DDRX`s mache, und dann vor dem eig. testprog. noch alle unbenutzen
> ports auf 1 schalte, ein mal der eine pin nicht geht, und ein mal der
> andere nicht.

Haben die beiden eine Brücke zwischeneinander?

> damit schließe ich ein hardware problem eig.
> aus?!

Vorzeitiger Schluss, bis zum Beweis des Gegenteils.

> darf ich eig. auf PORTD ein komplettes byte schreiben, wenn da doch 3
> pins als eingang definiert worden sind?

Wenn du dabei Bits setzt, die sich auf ein als Eingang geschaltetes
Pin beziehen, schaltest du dort die Pullups ein.

Aber du kannst natürlich immer nur ein komplettes Byte schreiben
(OK, von SBI/CBI abgesehen, aber die machen intern auch nur ein
read-modify-write, nur halt in zwei Takten).
OP
Jörg Wunsch schrieb:
> E. B. schrieb:
>> naja das was mich stutzig macht ist dass je nachdem was ich für PORTX
>> Und DDRX`s mache, und dann vor dem eig. testprog. noch alle unbenutzen
>> ports auf 1 schalte, ein mal der eine pin nicht geht, und ein mal der
>> andere nicht.
>
> Haben die beiden eine Brücke zwischeneinander?
Ne. Da hat bei der realisierung jede säule ihren eigenen pin.

>> damit schließe ich ein hardware problem eig.
>> aus?!
>
> Vorzeitiger Schluss, bis zum Beweis des Gegenteils.
  Ich mess jetzt mal mit dem Oszi nach was der pin genau schaltet...
  vl. kann ich mit nem transistor die 5v schalten.
>> darf ich eig. auf PORTD ein komplettes byte schreiben, wenn da doch 3
>> pins als eingang definiert worden sind?
>
> Wenn du dabei Bits setzt, die sich auf ein als Eingang geschaltetes
> Pin beziehen, schaltest du dort die Pullups ein.
>
> Aber du kannst natürlich immer nur ein komplettes Byte schreiben
> (OK, von SBI/CBI abgesehen, aber die machen intern auch nur ein
> read-modify-write, nur halt in zwei Takten).

hm joa daran liegst wohl auch nicht.
OP
Das oszi liefert kein brauchbares ergebnis; evlt. ein bedienfehler von 
mir oder der tastkopf ist kaputt :-( ich glaub ich kauf doch 
schieberegister
und oder nen coldfire...
bzw. nen neuen mega;
ist das normal dass so viele pins nicht gehen bei den atmels oder hab 
ich die echt schon alle geschossen.?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.