PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bascom Zeitfunktionen



murdocg
29.01.2013, 08:25
Hallo,
versuche mich gerade an der Microcontroller Programmierung in Basic.
Habe mir einen kleinen (3x3x3) Led Würfel gebastelt und möchte den über einen ATmega8 ansteuern.
Zum Würfel: Die Masse jeder "Etage" wird von einem Ausgang (A, B, C) des Controllers über einen Transistor gegen Masse geschaltet. Die Anoden jeder Säule sind ebenfalls verbunden und werden auch von einem Ausgang eingeschaltet.


$regfile = "m8def.dat"


Config Portb = Output
Config Portc = Output

A Alias Portb.0
B Alias Portb.1
C Alias Portb.2

S1 Alias Portb.3
S2 Alias Portb.4
S3 Alias Portb.5
S4 Alias Portb.6
S5 Alias Portb.7
S6 Alias Portc.0
S7 Alias Portc.1
S8 Alias Portc.2
S9 Alias Portc.3


Do

A = 1
B = 1
C = 1

S1 = 1
S2 = 0
Waitms 500
S2 = 1
S1 = 0
Waitms 500


Loop

End


Aber irgendwie will der Controller mit der "Wait" Anweisung nicht funktionieren. Wenn ich dieses Programm flashe, passiert nichts.
Habe ich einen Fehler im Programm? Wenn ja welchen?


Gruß

Kampi
29.01.2013, 08:50
Hey,

für zeitkritische Anwendungen musst du Bascom den Controllertakt mitteilen, damit Bascom damit die richtige Größe der Schleifen und Timereinstellungen berechnen kann.
Dies gilt auch für die "wait" Anweisung.
Änder mal deinen Programmkopf so ab (aber setzte für den "$crystal" Wert deinen benutzten Takt ein und ohne die ""!) und probier es erneut:



$regfile = "m8def.dat"
$crystal = "Dein verwendeter Takt"

murdocg
29.01.2013, 09:40
Auf der Platine habe ich eine 16MHz Quarz, geb ich dann die 16000000 einfach an?
Oder muss ich da erst noch die Fusebits ändern? Hatte da mal vor ewigen Zeiten was gelesen, aber keine Ahnung von.

Kampi
29.01.2013, 09:47
Hey,

du musst in den Fuses noch einstellen das du einen externen Takt verwendest.
Du kannst auch einfach erstmal in den Fuses nachschauen wie die stehen (die müssten Default mässig auf 1MHz interner RC-Oszi stehen) und dann schreibst du erstmal

$crystal = 1 000 000

Dann brauchst du nichts zu ändern und falls es funktioniert weißt du das es dieser Fehler war :)

BastelWastel
29.01.2013, 10:04
Du musst beides einstellen...die Fusebits damit der ATMEGA wirklich den externen Quarz verwendet.
Und die $crystal anweisung damit Bascom weiss welchen Takt du verwendest und dein Programm passend dazu erstellt.

murdocg
29.01.2013, 12:20
Hallo,
Danke für eure Antworten.
Habe es mit $crystal = 1 000 000 im Code versucht, das brachte aber keinen Erfolg. Es leuchtet garnichts.
Habe dann mal nachgemessen, die beiden Ausgänge auf die Säulen (also S1 und S2) schaltet er, allerdings permanent. Die Transistoren steuert er allerdings nicht an.

Gruß

Kampi
29.01.2013, 12:53
JTAG Interface noch aktiviert?
Das musst du auch über die Fuses deaktivieren.

murdocg
29.01.2013, 12:58
JTAG Interface?
Mit den Fuses hab ich mich noch nie beschäftigt, hab da absolut keine Ahnung von.

Kampi
29.01.2013, 13:20
Mach mal bitte einen Screenshot von deinem Fenster mit den Fuses und poste ihn hier :)

murdocg
29.01.2013, 15:09
Das ist vielleicht eine dumme Frage, aber wie lese ich die Fusebits aus?

Kampi
29.01.2013, 15:25
Hey,

du programmierst ja unter Bascom. Nutzt du dort auch die Funktion zum flashen?
Dann kannst du das hier drüber machen (klappt bei mir nicht, da mein Programmer mit Bascom nicht kompatibel ist):

http://img560.imageshack.us/img560/4853/unbenanntejm.png (http://imageshack.us/photo/my-images/560/unbenanntejm.png/)

murdocg
29.01.2013, 18:47
Danke für die Antwort, werde ich morgen versuchen.
Ich weiß garnicht ob mein Programmer das unterstützt. Habe das USB-AVR Lab von www.ullihome.de

Grüße
Fabian

murdocg
30.01.2013, 13:05
Habe einen Screenshot von den Fusebits gemacht.

24383

Kampi
30.01.2013, 14:30
Hey,

ich Esel...der Mega8 hat gar kein JTAG....
Aber du siehst da z.B. das Fusebit KLA987 ist für den Takt.....d.h. dein Controller ist auf einen 1MHz Takt eingestellt. Du musst also mit

$crystal = 1000000

arbeiten.
Aber ansonsten sehen die Fuses richtig aus....
Einen anderen Fehler sehe ich (im Moment) aber auch nicht :/

murdocg
30.01.2013, 16:01
Habs mit genau diesem Programm probiert

$regfile = "m8def.dat"
$crystal = 1000000

Config Portb = Output
Config Portc = Output

A Alias Portb.0
B Alias Portb.1
C Alias Portb.2

S1 Alias Portb.3
S2 Alias Portb.4
S3 Alias Portb.5
S4 Alias Portb.6
S5 Alias Portb.7
S6 Alias Portc.0
S7 Alias Portc.1
S8 Alias Portc.2
S9 Alias Portc.3


A = 1
B = 1
C = 1

Do

S1 = 1
S2 = 0
Waitms 500
S1 = 0
S2 = 1
Waitms 500


Loop

End 'end program


Weiterhin keine Funktion. Die Ausgänge für Spannung schaltet er, allerdings permanent.
Die Ausgänge auf die Transistoren (A, B, C) schaltet er nicht.

Gruß Fabian

HeXPloreR
30.01.2013, 16:27
Hallo,

nach Deinem Programm (welches zum ersten Post, übrigens geändert wurde) sollte es funktionieren.

Da bleibt wohl nur noch:
1. Schreibe das Programm testweise zu "nur eine LED Blinken" um (vielleicht alles LED mal einsetzen) - flashe dieses Programm - kommt es im µC an?
2. Ist der ISP Programmer abgezogen nach dem programmieren? - da die verwendeten Portb's im Programm auch Programmieranschlüsse sind.
3. Kommt das Highsignal an dem Transistor an, und nur der schaltet nicht durch? - Anschlussbezeichnung prüfen.
4. Fehlerhafter Aufbau der Schaltung - die richtige Transistoren verbaut, Led richtig rum?

Viele Grüße

murdocg
30.01.2013, 17:10
Hallo HeXPloreR,
danke für deine Antwort.


1. Schreibe das Programm testweise zu "nur eine LED Blinken" um (vielleicht alles LED mal einsetzen) - flashe dieses Programm - kommt es im µC an?
Wenn ich einzelne oder mehrere LED's nur leuchten lassen will funktioniert das einwandfrei. Das Programm kommt also im Controller an.


2. Ist der ISP Programmer abgezogen nach dem programmieren? - da die verwendeten Portb's im Programm auch Programmieranschlüsse sind.
Hatte ich vorher glaube ich immer dran gelassen, jetzt nach dem programmieren (nur eine Säule blinken) abgezogen, und die LED's leuchten immerhin. Auch wenn sie eigentlich mit 2 Hz blinken sollten.


3. Kommt das Highsignal an dem Transistor an, und nur der schaltet nicht durch? - Anschlussbezeichnung prüfen.
Der Transistor schaltet normalerweise, wird lediglich nicht angesteuert.


4. Fehlerhafter Aufbau der Schaltung - die richtige Transistoren verbaut, Led richtig rum?
Auszuschliessen. Wenn ich LED's oder Gruppen "normal" also dauerhaft ansteuere funktioniert alles.

Gruß Fabian

HeXPloreR
30.01.2013, 17:46
Du schaltest Deine Transistoren auch nur einmal auf Durchgang - ist bewußt? In beiden Programmen machst Du nichst anderes, nur einschalten - nicht aus, nicht wechselt sich da.

Ich fürchte Du musst sonst einfach einen Aufbau/Anschlussfehler haben. Denn nach dem Code muß es blinken - nicht "nur dauerhaft" leuchten.

Bricht die Spannung ein wenn zu viele LED's eingeschaltet werden? Du weißt der ATmega8 (glaub auch jeder andere) ist maximal pro Portpin mit 20mA belastbar, und insgesamt max. auf 200mA. Pro LED grob gerechnet 20mA * 27 (3 * 9) sind das 540mA + Transistorsteuerstrom = bischen viel. Allerdings bin ich mir mit der genauen Berechnung da garnicht so sicher - aber immerhin taugt es als Fehlerquelle.

Verwendete LED's?
Schaltplan?
Aufbaufotos?

Also funktioniert nun alles oder irgednwie doch nicht.

murdocg
30.01.2013, 21:46
Die Transistoren sollen auch nur durchgeschaltet werden. Das Blinken erfolgt dann über die Säulen. Aber mit dem Schaltplan sollte eigentlich alles klar sein.

24385
Mit meinen verwendeten LED's komme ich auf ca. 5mA pro LED, sollte von der Belastung also auch zu schaffen sein für den µC.
Anschlussfehler schließe ich nach mehrfacher Kontrolle durch insgesamt 6 Augen definitiv aus. Ist ja auch nichts kompliziertes.

Gruß Fabian

Thomas E.
31.01.2013, 04:45
Laut deinem Schaltplan hast du allerdings die Transistoren an PD4, PD5 und PD6 angeschlossen. In deinem Programm steht etwas anders. Dazu verwendest du in deinem Programm auch noch den PortC, den der Tiny2313 nicht hat.
Weiter oben schreibst du dauernd von einem Mega8 - also ist entweder dein Programm oder dein Schaltplan nicht korrekt.

murdocg
31.01.2013, 20:52
Mein Programm und der Schaltplan sind aufeinander und den ATmega 8 angepasst.
Bei dem Plan ging es nur um die Verschaltung der Transistoren und LED's.

Nette Grüße
Fabian

Thomas E.
01.02.2013, 04:04
Eine Idee hab ich noch: Du schreibst, es funktioniert einige LEDs anzusteuern. Willst du aber richtig loslegen und eine größere Anzahl an LEDs ansteuern, funktioniert nichts mehr. Liege ich richtig?

Wenn ja, dann könnte ein Einbrechen der Versorgung die Ursache sein. In deinem Schaltplan (der immer noch nicht aktualisiert ist!) fehlen sämtliche Abblockkondensatoren (100n Kerkos). Außerdem ist unklar, ob du auch beim Mega8 AVCC und AGND angeschlossen (mit Abblockkondensator) hast.

murdocg
01.02.2013, 10:50
So ist mein Controller angeschlossen.
24391
Die LED's hängen wie im Programm an den Controller Ports.

Habe bisher noch keine Pläne am PC gezeichnet. Welche Software wird hier verwendet? Eagle?
Dann versuche ich mich heute Abend auch mal daran.

Nette Grüße Fabian