www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LED Leiste ansteuern


Autor: Michael Justinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich muss bei meinem Mikrocontroller an Port A eine LED Leiste 
anschließen. Die LED´s sollen leuchten wenn der jeweilige Pin nicht 
gesetzt wurde. Andernfalls soll die LED aus sein.Der Schaltplan wurde 
mir von einem Lehrer gegeben.

Ich habe den Schaltplan genau so umgesetzt jedoch funktioniert das 
irgendwie nicht. Ich habe auch mal versuch zwischen  Vcc  und einem Port 
Spannung zu messen jedoch kann man dort auch nichts messen.

Funktioniert der Schaltplan überhaupt?
Schaltplan: http://michaeljuston.de/ansteuerung_led.JPG


Mit freundlichen Grüßen

Michael

Autor: Jürgen Berger (hicom)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, natürlich wenn der Ausgang auf 0 ist leuchtet die
jeweilige LED.

Autor: Frank B_. (frank_b) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du die LED's richtig herum angeschlossen ?

Autor: Michael Justinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, es liegt daran das der Pin nicht auf '0' ist. Wenn ich die Kathode 
einer LED  auf Masse lege leuchtet diese auch. Der Stromkreis wird nicht 
über den Controller geschlossen.  Es befindet sich zur Zeit kein 
Programm auf dem Controller, kann es daran liegen?


mfg

Michael

Autor: Tim T. (tim_taylor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja kann es^^ rotfl

Autor: Hellboy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein es kann nicht nur daran liegen ... es liegt garantiert da dran

Autor: Michael Justinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
sorry beschäftige mich erst seit kurzem damit. Wie würde denn der C- 
Quelltext aussehen für das auf ‚0‘ setzen?

Ich kann einen Pin auf ‚1‘ setzen und wieder rücksetzen aber wie setze 
ich ihn auf ‚0‘ ?

Danke für eure Hilfe.

Autor: Murmel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schwerwiegende Sache.

Wenn er nicht auf 0 ist, ist er auf 1, wenn er nicht auf 1 ist, ist er 
auf 0.
Oderaber er zappelt hin und her bei undefinierten Pegel.

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Data-Direction-Register (DDRx) für den Pin auf 1 setzen und 
Port-Register (PORTx) auf 0 lassen.

DDRB = 1<<PB0; // Für Port B Pin 0

Autor: Michael Justinger (juston)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
sehr schön jetzt geht’s.
Abschließend hier der Quelltext.
#include <avr\io.h>

int main(void)
 {
   DDRA  = 0b11111111;
   PORTA = 0b00000000;




    while(1)
     {
       
        {
       DDRA = 1<<PA0; // Für Port A Pin 0
       DDRA = 1<<PA1; // Für Port A Pin 1
       DDRA = 1<<PA2; // Für Port A Pin 2
       DDRA = 1<<PA3; // Für Port A Pin 3
       DDRA = 1<<PA4; // Für Port A Pin 4
       DDRA = 1<<PA5; // Für Port A Pin 5
       DDRA = 1<<PA6; // Für Port A Pin 6
       DDRA = 1<<PA7; // Für Port A Pin 7       
        }
      
     }
 }

Danke!

PS.: Endlich habe ich den Login Button gefunden ; )

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du jetzt noch erklären kannst, was das in der while-Schleife 
bewirken soll.

Leuchten Dir die LEDs etwa zu hell?



Peter

Autor: Michael Justinger (juston)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
das hat eigentlich keinen Grund.

Ich habe das Programm erweitert so das alle Ports Auf ‚0‘ gesetzt werden 
jedoch leuchtet dann die LED an Port A7, B7, C7, D7 heller als alle 
anderen.

Ich habe einfach den Teil des Quelltexte der für das auf ‚0‘ setzen 
nötig ist kopiert und dann den Portbuchstaben ersetzt aber das 
funktioniert nicht richtig. Die letzte LED ist heller


Mit freundlichen Grüßen

Michael

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael Justinger wrote:
> Hi,
> das hat eigentlich keinen Grund.

Warum hast Du es dann gemacht?

Programmzeilen sollten immer nen Grund haben, sonst schmeiß sie raus.


> Ich habe einfach den Teil des Quelltexte der für das auf ‚0‘ setzen
> nötig ist kopiert und dann den Portbuchstaben ersetzt aber das
> funktioniert nicht richtig. Die letzte LED ist heller

Ja, das muß so sein, weil Du Dir eben nichts dabei gedacht hast.

Du schaltest mit jeder Zeile die vorhergehende LED aus.


Peter

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Peter Dannegger (peda)

>Du schaltest mit jeder Zeile die vorhergehende LED aus.

Für die Einen ist es ein Programmierfehler, für die Anderen das 
schnellste Lauflicht der Welt.

;-)
SCNR
Falk

Autor: Michael Justinger (juston)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe bis jetzt immer alles in einer while Schleife drinnen gehabt 
weil ich es so gelernt habe. Aber warum weis ich auch nicht. Der Lehrer 
meinte nur, dass es nötig sei damit das Programm läuft.

Soll ich etwa die Anweisung für einen kompletten Port in eine Zeile 
Schreiben und mit && verknüpfen?

Oder wie kann ich es erreichen, dass alle gleich hell sind und trotzdem 
alle Ports gesetzt werden.

Mit freundlichen Grüßen
Michel

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael Justinger wrote:
> Ich habe bis jetzt immer alles in einer while Schleife drinnen gehabt
> weil ich es so gelernt habe. Aber warum weis ich auch nicht. Der Lehrer
> meinte nur, dass es nötig sei damit das Programm läuft.

Dann ist entweder dein Lehrer scheisse oder du hast nicht aufgepasst.

Eine While-Schleife wird immer dann gebraucht, wenn bestimmte Codezeilen 
zyklisch abgearbeitet werden sollen. Würdest du sie nicht setzen, würde 
der Kontroller deine Codezeilen einmalig abarbeiten und die Ausführung 
dann beenden und so lange nichts mehr tun, bis du ihn entweder Resetest 
oder über die Spannungsversorgnung neu startest.

> Soll ich etwa die Anweisung für einen kompletten Port in eine Zeile
> Schreiben und mit && verknüpfen?

Nein, so wie du diese Aufgabe geschildert hast, reicht es, wenn der 
Controller die Ausgänge auf '0' setzt uns sich dann beendet. Eine 
While-Schleife ist unnötig.

> Oder wie kann ich es erreichen, dass alle gleich hell sind und trotzdem
> alle Ports gesetzt werden.

Wenn dein Kontroller einmalig "PORTA=0;" ausführt, reicht daß, um ALLE 
Ausgänge dauerhaft auf '0' zu setzen. Eine einzelne Adressierungen 
einzelner Portleitungen ist nicht nötig, genausowenig wie irgendeine 
Whileschleife.

Die AVRLibC sorgt schon dafür, das dein Kontroller nicht übers Ziel 
hinausschiesst.

Autor: Michael Justinger (juston)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
ich habe immer kleine Programme geschrieben die Prüfen ob ein Pin ‚1‘ 
hat, das Programm sollte immer weiterlaufen weil an den Ports Sensoren 
waren die Abgefragt werden sollten.  Jetzt ist mir auch klar, dass eine 
while- Schleife hier unsinnig ist. Am Lehrer liegt es nicht, der ist 
gut.

Ich werde es mit "PORTA=0;" usw. ausprobieren und mich morgen wieder 
melden.

Danke für eure SCHNELLE Hilfe.



Mit freundlichen Grüßen


Michael

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael Justinger wrote:

> Am Lehrer liegt es nicht, der ist gut.

LOL ;) Ein Schüler, der seinen Lehrer lobt. Das hat Seltenheitswert :)

> Ich werde es mit "PORTA=0;" usw. ausprobieren und mich morgen wieder
> melden.

DDRA=255; nicht vergessen ;)

Autor: Michael Justinger (juston)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
hab es heute Morgen ausprobiert und es funktioniert, erstaunlich wie 
hell die LED´s leuchten können.

Allerdings liegt an den Pins 24 – 27 keine Spannung an.
Das wäre
PC2 (TCK)
PC3 (TMS)
PC4 (TDO)
PC5 (TDI)

Warum ist das so?



Mit freundlichen Grüßen

Michael

Autor: He Ro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vermutlich, weil diese vier Pins noch als JTAG-Interface geschaltet 
sind. Das kann man mit irgendeinem Fuse-Bit beim Programmieren des 
Controllers abschalten - welches Bit das ist, steht im Datenblatt.

MfG, Heiko

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Niels Hüsken wrote:

> genausowenig wie irgendeine
> Whileschleife.

Eine While-Schleife ist immer nötig!

Das Main darf nie verlassen werden!
Es gibt kein Betriebssystem, wohin die Ausführung zurückkehern kann.

Wenn aber nur einmalige und keine periodischen Aktionen auszuführen 
sind, dann ist die While-Schleife eben leer.


Peter

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Peter Dannegger (peda)

>Eine While-Schleife ist immer nötig!

JAIN.

>Das Main darf nie verlassen werden!

JAIN.

>Es gibt kein Betriebssystem, wohin die Ausführung zurückkehern kann.

Sicher. Aber der WINAVR läuft danach in eine Endlosschleife, viele 
andere Compiler auch. JA, einige springen isn Nirvana, das ist dann 
schlecht.

MFG
Falk

Autor: Michael Justinger (juston)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mal in dem Datenblatt nachgeschaut und folgendes gefunden:

• TDI – Port C, Bit 5
TDI, JTAG Test Data In: Serial input data to be shifted in to the 
Instruction Register or Data Register (scan chains). When the JTAG 
interface is enabled, this pin can not be used as an I/O pin.

• TDO – Port C, Bit 4
TDO, JTAG Test Data Out: Serial output data from Instruction Register or 
Data Register. When the JTAG interface is enabled, this pin can not be 
used as an I/O pin. The TD0 pin is tri-stated unless TAP states that 
shifts out data are entered.

• TMS – Port C, Bit 3
TMS, JTAG Test Mode Select: This pin is used for navigating through the 
TAP-controller state machine. When the JTAG interface is enabled, this 
pin can not be used as an I/O pin.

• TCK – Port C, Bit 2
TCK, JTAG Test Clock: JTAG operation is synchronous to TCK. When the 
JTAG interface is enabled, this pin can not be used as an I/O pin.

Ich konnte aber nicht finden welche Fuse-Bits ich setzen muss damit ich 
auch diese vier Ausgänge auf 0 setzen kann.

Datenblatt:
http://www.alldatasheet.com/view.jsp?Searchword=ATMEGA32

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Michael Justinger (juston)

>Ich konnte aber nicht finden welche Fuse-Bits ich setzen muss damit ich
>auch diese vier Ausgänge auf 0 setzen kann.

???
Wie wäre es mit JTAGEN im Fuse High Byte?

MFG
Falk

Autor: Patrick S. (kof)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aber achtung!!!
wie willst du ihn danach noch programmieren, wenn du jtag deaktiviert 
hast? ;-)

Autor: Michael Justinger (juston)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaube ich lass die  Konfiguration so wie sie ist. Mein Lehrer 
meinte wir sollten nicht mit den Fuse-Bit „experimentieren“. Ich 
verwende ja auch immer noch den internen Oszillator weil ich nicht weis 
welche Bits ich benötige für den externen Quarzoszillator zu verwenden.

Eigentlich sollte ich ja auch nur den Port A verwenden um die LED´s 
einzuschalten wenn der Pin eine ‚0‘ hat. Die Aufgabe ist ja erfüllt.

Als nächstes werde ich versuchen ein Lauflicht zu programmieren. (Aber 
diesmal nicht das schnellste der Welt.... LOL ).


Michael

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fuse ändern ist nicht nötig.

Man kann das JTAG auch per Software abschalten:

MCUCSR = 1<<JTD;
MCUCSR = 1<<JTD;



Peter

Autor: Michael Justinger (juston)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
habe eben mal das Programm für das Lauflicht fertig gestellt. Schaut es 
euch bitte mal an, es gibt sicher noch was zu verbessern.

Kompletter Programmordner
http://www.michaeljuston.de/lauflicht_test.zip


Mit freundlichen Grüßen

Michael

Autor: winne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@peter

dann solltest auch du dazu schreiben, dass man den Befehl 2 mal 
unmittelbar hinternander ausführen muss, damit das Bit auch gesetzt 
wird.
ja das ist Absicht

Dies soll ein versehentliches aussperren via SW verhindern.

Weitere Infos siehe Datasheet.

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Code ist zwar kompletter unsinn, aber eines Interessiert mich dennoch. 
Welcher wirre Gedanke steckt hinter
   while (TCNT1 != 0) 

   {

       PINA = 0b11111111;     

   }

Autor: Michael Justinger (juston)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das soll dafür sorgen das immer alle Ausgänge von Port A eine ‚1‘ haben 
und somit keine LED an ist. Natürlich nur solange bis der Zahler den 
Maximalwert erreicht hat und wieder bei 0 anfängt.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PINA ist aber nur ein Leseregister, damit kannste nicht die LEDs 
beeinflussen. Du musst schon PORTA beschreiben.

Autor: Michael Justinger (juston)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Komisch, das Programm läuft aber.
Wie hättet ihr denn das Programm geschrieben. Ich bin eigentlich kein 
Programmier.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner wrote:

> Sicher. Aber der WINAVR läuft danach in eine Endlosschleife, viele
> andere Compiler auch.

Nö, der macht RET, also Stackunderflow.

Dürfte 0x0000 oder 0xFFFF als Sprungziel ergeben, also nochmal von vorne 
über den Resetvektor.


> JA, einige springen isn Nirvana, das ist dann
> schlecht.

Ja, sieht man im Listing ganz deutlich:

int main( void )
{
  4c:   81 e0           ldi     r24, 0x01       ; 1
  4e:   88 bb           out     0x18, r24       ; 24
  PORTB = 1;
  return 0;
}
  50:   80 e0           ldi     r24, 0x00       ; 0
  52:   90 e0           ldi     r25, 0x00       ; 0
  54:   08 95           ret


Andere Compiler mögen eine Endlosschleife hinzufügen, der WINAVR aber 
nicht!

Man sollte aber trotzdem auch bei den anderen Compilern die Sachen extra 
hinschreiben, die nicht durch den C-Standard abgedeckt sind.


Peter

Autor: Frank B_. (frank_b) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peda:

zumindest der neueste WINAVR knallt ne Endlosschleife rein:
00000382 <_exit>:
 382:  ff cf         rjmp  .-2        ; 0x382 <_exit>

(Auszug aus einem anderem Programm)

lg, Frank

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die LibC des AVR-GCC sorgt dafür das der Kontroller nach dem return aus 
der Main in einer Endlosschleife endet! Da bin ich mir 100% sicher.

Das kann Jörg Wunsch bestimmt bestätigen. Der sollte das wissen.

Autor: Frank B_. (frank_b) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Evtl. Arbeitet Peda mit einer älteren Version der libc, in der das noch 
nicht drin war.
 Frank

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frank B_. wrote:
> zumindest der neueste WINAVR knallt ne Endlosschleife rein:

Stimmt (habs eben installiert), der WINAVR ist immer mal für ne 
Überraschung gut.

Aber dann spart die Loop immerhin 4 Bytes Code (oder man ignoriert die 
Warnung wegen dem fehlenden Return-Wert).

Wenns also spart, ein Grund mehr, C-konform zu sein.

Man sollte auch nicht absichtlich versionsabhängigen Code schreiben.


Peter

P.S.:
Ist auch nicht so der Brüller mit dem neuen Compiler beim ATtiny13 von 
den 64 Bytes SRAM nur 62 effektiv zu haben wegen der Main-Returnadresse.

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger wrote:

> Ist auch nicht so der Brüller mit dem neuen Compiler beim ATtiny13 von
> den 64 Bytes SRAM nur 62 effektiv zu haben wegen der Main-Returnadresse.

Wer auf die zwei Byte angewiesen ist, wäre ohnehin mit Assembler besser 
beraten. Mal abgesehen davon, daß man die Speicherzellen auch 
überschreiben kann, wenn man sie nicht braucht... Meine Meinung....

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.