Forum: Mikrocontroller und Digitale Elektronik Mehrere I/O Pins am AT91SAM7S setzen


von Peter P. (uncle-sam7)


Lesenswert?

Hallo NG,

ich hätte da mal eine Frage. Wenn ich das richtig verstanden habe, 
setzte, beziehungsweise "lösche" ich die Ausgänge am AT91SAM7S mit 2 
verschiedenen Registern (so hab ichs jetzt zumindest mal für meinen 8Bit 
R2R DAC gemacht):

void sound_out(char value)
{
p_pPio->PIO_CODR = BIT9+BIT10+BIT11+BIT12+BIT13+BIT14+BIT15+BIT16;
p_pPio->PIO_SODR = (unsigned long)value << 9;
}

Was ich jetzt nicht ganz verstehe, dann müsste doch auf den Pins immer 
ein "Zucken" entstehen, da ich ja nicht 100% gleichzeitig löschen und 
setzen kann, oder?

Wie macht man denn sowas. Muss ich da vor dem Setzen noch etwas 
deaktivieren und danach wieder aktivieren?

Was jetzt hier auch noch ganz gut dazu passt (ist mir einfach sooooo 
wichtig): Was passiert denn, wenn ich TTL Signale an die Pins 1:1 
anklemme (also ohne Pegelwandelt etc. dazwischen)?

Danke für jede Hilfe und jeden Tip.

MfG
Peter

von Lehrmann M. (ubimbo)


Lesenswert?

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
http://www.mikrocontroller.net/articles/Bitmanipulation

Grundlagenarbeit.

Peter Pippinger schrieb:
> Was ich jetzt nicht ganz verstehe, dann müsste doch auf den Pins immer
> ein "Zucken" entstehen, da ich ja nicht 100% gleichzeitig löschen und
> setzen kann, oder?

Glaub ich eher weniger ... zuerst wird das Register gesetzt und dann 
durchgeschaltet. Darum dauert ein Zyklus (eine asm Anweisung) auch immer 
4 Takte.

Peter Pippinger schrieb:
> Wie macht man denn sowas. Muss ich da vor dem Setzen noch etwas
> deaktivieren und danach wieder aktivieren?

-> Tutorial

Peter Pippinger schrieb:
> Was jetzt hier auch noch ganz gut dazu passt (ist mir einfach sooooo
> wichtig): Was passiert denn, wenn ich TTL Signale an die Pins 1:1
> anklemme (also ohne Pegelwandelt etc. dazwischen)?

ja was meinst du denn das passiert? Der AVR hustet? Nö warum solltest du 
es nicht anklemmen dürfen? Soweit sich die Spannungen in denen im 
Datenblatt angegebenen Bereichen befinden (in Abhängigkeit von Vcc) ist 
alles in bester Ordnung.

Stichworte sind Pullupwiderstand und Pulldownwiderstand bzw. wenn nötig:
http://www.mikrocontroller.net/articles/Pegelwandler

und nu lies das Tutorial das steht da nämlich alles drin. Nicht faul 
sein !

von Andreas B. (Gast)


Lesenswert?

Peter Pippinger schrieb:
> void sound_out(char value)
> {
> p_pPio->PIO_CODR = BIT9+BIT10+BIT11+BIT12+BIT13+BIT14+BIT15+BIT16;
> p_pPio->PIO_SODR = (unsigned long)value << 9;
> }
>
> Was ich jetzt nicht ganz verstehe, dann müsste doch auf den Pins immer
> ein "Zucken" entstehen, da ich ja nicht 100% gleichzeitig löschen und
> setzen kann, oder?

Ja, die CODR und SODR sind perfekt für das meiste, weil man da kein 
read-modify-write durchführen muss und deshalb auch nicht gegen 
Interrupts schützen muss.

Um Pins in einem Schritt sowohl zu setzen als auch zu löschen, musst du 
die gewünschten Pins per OWER freischalten und kannst dann deren Status 
direkt im ODSR setzen. Siehe Datenblatt unter PIO / Synchronous Data 
Output (Kapitel 27.4.5).

von Peter Pippinger (Gast)


Lesenswert?

Hallo Michael,

zunächst mal Danke für Deine Antwort.

>http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
>http://www.mikrocontroller.net/articles/Bitmanipulation
>Grundlagenarbeit.

Naja, die Bitmanipulation habe ich ja soweit hinbekommen. Es ging ja 
mehr darum, ob ich denn auch gleichzeitig verschiedene Pins auf High UND 
Low setzen kann...

>Peter Pippinger schrieb:
>> Was ich jetzt nicht ganz verstehe, dann müsste doch auf den Pins immer
>> ein "Zucken" entstehen, da ich ja nicht 100% gleichzeitig löschen und
>> setzen kann, oder?
>Glaub ich eher weniger ... zuerst wird das Register gesetzt und dann
>durchgeschaltet. Darum dauert ein Zyklus (eine asm Anweisung) auch immer
>4 Takte.

Glaub ich schon, da ja jeweils einer der beiden "Befehle" direkte 
Auswirkungen auf die Pins hat, oder? Andreas hat was dazu geschrieben, 
was mir so einleuchten würde.

>Peter Pippinger schrieb:
>> Wie macht man denn sowas. Muss ich da vor dem Setzen noch etwas
>> deaktivieren und danach wieder aktivieren?
>-> Tutorial
AVR != AT91SAM7S

>> Was jetzt hier auch noch ganz gut dazu passt (ist mir einfach sooooo
>> wichtig): Was passiert denn, wenn ich TTL Signale an die Pins 1:1
>> anklemme (also ohne Pegelwandelt etc. dazwischen)?
>ja was meinst du denn das passiert? Der AVR hustet? Nö warum solltest du
>es nicht anklemmen dürfen? Soweit sich die Spannungen in denen im
>Datenblatt angegebenen Bereichen befinden (in Abhängigkeit von Vcc) ist
>alles in bester Ordnung.
Naja, die Antwort war sicherlich lieb gemeint, aber mit "Wenn Du alles 
richtig machst, dann funktioniert auch alles" kann ich leider nicht viel 
anfangen. Ich habe halt nur die Angst, dass ich was kaputt mache (das 
ging früher immer recht flott, wenn ich den Lotkolben in die Hand nahm 
;-)

>Stichworte sind Pullupwiderstand und Pulldownwiderstand bzw. wenn nötig:
>http://www.mikrocontroller.net/articles/Pegelwandler
Das hab ich schon mal überflogen, aber beim AT91SAM7 steht auf der 
Webseite, dass der TTL-tollerant wäre. Deswegen weiß ich nicht, ob ich 
die einfach ranhängen kann und ob dann was passieren würde...

>und nu lies das Tutorial das steht da nämlich alles drin. Nicht faul
>sein !
Ich bin nicht faul. Ich würde das nur sooooo gerne machen und hab leider 
zu wenig Zeit. Ich dachte halt, dass ich im Forum schneller Fragen zu 
bestimmten Dingen beantwortet bekomme.

Also bitte nicht böse sein, aber das ein oder andere Mal werden bestimmt 
von meiner Seite noch Fragen kommen, wo sich ein Profi ?$%! denkt...

Viele Grüße,
Peter

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
Noch kein Account? Hier anmelden.