Forum: Mikrocontroller und Digitale Elektronik Programm für Testgerät


von dumbo27 (Gast)


Lesenswert?

Hallo, ich bin ein Neuling was AVR-Programmierung angeht.
Ich möchte einen Kabeltester bauen. Er soll folgendermaßen 
funktionieren.
10 Leitungen teste mit einem Taster.Das eine Ende der Leitungen am 
Atmega dran.Am ende der Leitungen sind LED's zur verdeutlichung. Ich 
benötige 10 Ausgänge die nacheinander geschaltet werden. D.h. einmal 
tasten erstes kabel (Ausgang 1 aktiv), nochmal tasten zweites kabel (nur 
2. Ausgang aktiv),....und am ende alle Kabel testen. Die Kabel am besten 
noch einlesen und bei Fehler eine LED aktivieren. nach 5 Minuten ohne 
Taste sleepmodus.
Hat jemand sowas ähnliches schon gemacht, bzw. kann mir kurz schreiben 
wie ich das am günstigsten programmieren kann. Danke

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Wenn du eh schon "das andere Ende" des Kabels identifizerit hast,. dann 
ist es sinnvoller, da einen passenden Abschlsusstecker dran zu stecken.

Unter Zuhilfenahme der Einspeisung "an einem ende" kannst du nun de 
Belegung und Funktion ebenfalls an diesem >ende ermitteln.

Andernfalls müßtest du immer von einem zum anderen Ende des Kabels 
rennen, um festzustellen was wo los ist.

von Karl H. (kbuchegg)


Lesenswert?

dumbo27 schrieb:
> Hallo, ich bin ein Neuling was AVR-Programmierung angeht.

> Hat jemand sowas ähnliches schon gemacht, bzw. kann mir kurz schreiben
> wie ich das am günstigsten programmieren kann.

Indem du von der Pieke auf programmieren lernst.

Stell dir das 'Kabel' als nicht existent vor. Dann bleibt von deiner 
Aufgabenstellung übrig:
An einem µC sind 10 LED angeschlossen, die auf Tastendruck aufleuchten 
sollen.

Bis auf den Teil mit dem einzelnen Tastendruck, ist das so ziemlich die 
2.te oder 3.te Einsteigerübung. Gleich nach "eine LED soll leuchten" und 
"eine LED soll blinken" und noch bevor "und jetzt bauen wir uns ein 
Knight Rider Lauflicht"


AVR-Tutorial
AVR-GCC-Tutorial

von dumbo27 (Gast)


Lesenswert?

Danke für eure Antworten.
ich frag mich aber wie ich die LED nacheinander per Tastendruck 
aufleuchten lassen kann.
Muss ich da nen Zähler mit einbauen der bei jedem Tastendruck eins 
hochzählt und dann bei der jeweiligen Zählerzahl die jeweilige LED 
leuchtet?
Oder gibts da einfachere möglichkeiten.

ich programmiere mit bascom. Vielleicht hat da von euch schon mal jemand 
sowas programmiert.

von Karl H. (kbuchegg)


Lesenswert?

dumbo27 schrieb:
> Danke für eure Antworten.
> ich frag mich aber wie ich die LED nacheinander per Tastendruck
> aufleuchten lassen kann.

Denk dir was aus

> Muss ich da nen Zähler mit einbauen der bei jedem Tastendruck eins
> hochzählt und dann bei der jeweiligen Zählerzahl die jeweilige LED
> leuchtet?
> Oder gibts da einfachere möglichkeiten.

Einfachheit liegt auch im Auge des Betrachters.
Im Zweifelsfall ist die 'einfachste' Möglichkeit diejenige, die du 
realisieren kannst

> ich programmiere mit bascom. Vielleicht hat da von euch schon mal jemand
> sowas programmiert.

Du drehst und windest dich, anstelle das du einfach mal ein bischen was 
ausprobierst und so selber lernst.

Hinweis:

In einem Computer spielt sich alles binär ab. Lauter 0 und 1

Wenn du ein paar Led an einem Port hast, dann hast du am Port 8 Bit (8 
LED)
die entsprechenden Binärzahlen sehen so aus

    00000000    (dezimal 0)
    00000001    (dezimal 1)
    00000010    (dezimal 2)
    00000011    (dezimal 3)
    00000100    (dezimal 4)
    00000101    (dezimal 5)
    00000110    (dezimal 6)
    00000111    (dezimal 7)
    00001000    (dezimal 8)
    ....

Wenn du jetzt mal die Zahlen herausgreifst, bei denen genau ein 1 
auftuacht, dann sind das nacheinander

    1, 2, 4, 8  (und die Reihe würde weitergehen mit 16, 32, 64, 128)

Fällt dir was auf?
Jede Zahl ist genau das doppelte der vorhergehenden Zahl
Dies liegt daran, dass wir im Binärsystem arbeiten.
Oder anders ausgedrückt: um an der Position i eine 1 zu erzeugen, gibt 
man die Zahl 2 hoch i aus

Noch ein Hinweis:
Auf einem µC gibt es normalerweise auch 'Schiebebefehle'. Damit wird das 
Bitmuster einer Zahl zb. einfach 1 Stelle nach links geschoben.
Aus dem Bitmuster  00001000 (=dezimal 8) wird so das Bitmuster 00010000 
(=dezimal 16)

Noch ein Hinweis, der in eine andere Richtung führt: Du möchtest in 
deinem BASCOM Handbuch, bzw. BASCOM Tutorial auch einmal über Arrays (zu 
deutsch 'Felder') nachlesen.


Es gibt unendlich viele Möglichkeiten, wie du so ein 'Lauflicht', 
welches mit einer Taste weiter geschoben wird, realisieren kannst. Denk 
dir was aus, implementiere es, sieh nach ob deine Idee funktioniert.
Auf der Ebene, auf der du zur Zeit arbeitest, ist das momentan für dich 
eine gute Möglichkeit um zu lernen. Gleich nachdem du 
Tutorials/Bücher/Hilfe gelesen hast.

(Sorry: Aber weiter lehn ich mich nicht aus dem Fenster. LED gezielt zum 
Leuchten zu bringen, ist eine einfache Übung. DU willst ein Gerät bauen. 
Also musst DU auch die Grundlagen lernen. Und einen Portpin auf 0 oder 1 
zu setzen, je nach Umgebungsbedingen, das ist nun mal das kleine Ein mal 
Eins der µC-Programmierung.)

von dumbo27 (Gast)


Lesenswert?

ja ich weiss schon. Led bring ich ja schon zum leuchten und ein 
lauflicht kann ich auch schon programmieren. ich möcht ja auch kein 
fertiges programm.
das Problem ist ja das ich mit jedem tastendruck eine LED weiter (aber 
nur diese) zum leuchten bekommen möchte und am Ende sollen alle 
leuchten. Deshalb denk ich ja das es mit einem zähler am einfachsten 
wäre. Drum möcht ich ja fragen ob es da noch einfachere möglichkeiten 
gibt. mit einem schieberegister kann ich am ende ja nicht alle leuchten 
lassen.

von Markus (Gast)


Lesenswert?

dumbo27 schrieb:
> ja ich weiss schon. Led bring ich ja schon zum leuchten und ein
> lauflicht kann ich auch schon programmieren. ich möcht ja auch kein
> fertiges programm.

Wenn Du ein Lauflicht programmieren kannst, wo liegt denn dann das 
Problem?

Du hast 10 LEDs? Dann definier Dir doch eine 16Bit-Variable und schiebe 
in einer Schleife immer ein 1-Bit eine Stelle nach links. Dann leuchten 
alle nacheinander. Und beim Zählerstand 11 (oder 10, je nachdem ob zu 
bei 0 oder 1 anfängst zu zählen) setzt Du dann alle Bits.
Mit BASCOM kenn ich mich nicht aus, aber das wird ähnlich wie hier 
http://www.mikrocontroller.net/articles/Bitmanipulation beschrieben 
funktionieren.

von Dumbo27 (Gast)


Lesenswert?

Also hier mal mein erster versuch. funktioniert leider noch nicht.
könnt ihr mir da helfen


$regfile "m8def.dat"
$crystal = 1000000

Config Portd = Input
Config Portb = Output
Dim B As Integer

Do
 B = 0

   Do

      If Pind.2 = 1 Then B + 1

      If B = 0 Then Ddrb = 10000000
      If B = 1 Then Ddrb = 01000000
      If B = 2 Then Ddrb = 00100000
      If B = 3 Then Ddrb = 00100000
      If B = 4 Then Ddrb = 00010000
      If B = 5 Then Ddrb = 00001000
      If B = 6 Then Ddrb = 00000100
      If B = 7 Then Ddrb = 00000010
      If B = 8 Then Ddrb = 00000001
      If B = 9 Then Ddrb = 11111111
      if B = 10 then B = 0

    Loop


Loop

von Markus (Gast)


Lesenswert?

Du gibst Werte mit PORTB=... an PORTB aus.Das DDRB, setzt Du am Anfang 
deines Programms auf 0xFF, damit werden alle Pins als Ausgänge 
definiert. Danach änderst Du DDRB nicht mehr.

von Markus (Gast)


Lesenswert?

Und lass mal die äußere Do..Loop-Schleife weg.Was soll die denn bringen. 
Du könntest außerdem Probleme bekommen, wenn Du deinen Taster nicht 
enptrellst. Infos dazu im Tutorial: 
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Tasten

von Markus (Gast)


Lesenswert?

Dumbo27 schrieb:
> If B = 2 Then Ddrb = 00100000
> If B = 3 Then Ddrb = 00100000

00100000 hast Du doppelt

von Dumbo27 (Gast)


Lesenswert?

hallo,

also hier mein programm. leider funktioniert es noch nicht. auch wenn 
ich den taster entprelle.
kann mir jemand sagen wo der Fehler liegt.

$regfile "m8def.dat"
$crystal = 1000000

Config Portd = Input
Config Portb = Output
Dim B As Integer
Portd = 255

B = 0

   Do


      If Pind.2 = 0 Then B = B + 1

      If B = 0 Then Portb = &B00000000
      If B = 1 Then Portb = &B10101010
      If B = 2 Then Portb = &B11111111
      If B = 3 Then B = 1

   Loop

von Ben I. (beninho)


Lesenswert?

Ich hab keinen Plan von BASCOM, aber wird dein Code ohne errors und 
warnings kompiliert? bei dem BASCOM-Code hier 
http://www.windred.dk/avr/timer-pwm-counter/default.htm wird jede 
if-Abfrage mit endif abgeschlossen. Außerdem wird das Ende des 
Hauptprogramms mit end abgeschlossen.
Wie hast Du den Taster angeschlossen? Wenn Du "If Pind.2 = 0" als 
Abfrage verwendest musst du einen Pullup-Widerstand von VCC nach Pind.2 
und den Taster zw. Pind.2 und GND anschließen. 
http://www.mikrocontroller.net/articles/AVR-Tutorial:_IO-Grundlagen
Wo ist die Entprellung? Poste mal den kompletten Code.

von Nachtschichtler (Gast)


Lesenswert?

Hallo!

If Then in einer Zeile geht.

Timingproblem. Taster gedrückt und zählt hoch wie irre.
So schnell kommst Du nicht zum Denken bist Du über 3 hinaus.

MfG

von Nachtschichtler (Gast)


Lesenswert?

Nachtschichtler schrieb:
> So schnell kommst Du nicht zum Denken bist Du über 3 hinaus.

Blödsinn!

Die Nacht dauert einfach schon zu lange.

MfG

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.