loetstelle.net
Lötstelle Userforum
 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen   RegistrierenRegistrieren 
 ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Digitale Lösung für Schaltungen / Problem?
Gehe zu Seite Zurück  1, 2, 3, 4 ... 18, 19, 20  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    loetstelle.net Foren-Übersicht -> Microcontroller und DSP
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
BellaD



Anmeldungsdatum: 03.12.2006
Beiträge: 1708
Wohnort: Klinik der misshandelten Kuscheltiere

BeitragVerfasst am: Do 13.März 2008 23:14:35    Titel: Bauteile finden Antworten mit Zitat

Moin

hier rückmeldung Wink ich glaub bei jedem Tastendruck geht die nächste Led an , bis es wieder von vorne anfängt

sorry , ich hab kein Bascom und werde es mir auch nicht unbedingt antun wollen , das ist jetzt nicht abfällig gemeint sondern ich mach schon jahrelang in Assembler und ab und an' C 'und darum reicht mir AVR Studio und Winavr völlig -
wenn ich mal was in basic mache nehm ich fastbasic für den AVR da kann man wenigstens aus dem erzeugten objectfile den assemblercode mopsen Rolling Eyes
Ansonsten find ich es toll was du hier machst und lese mit - ob die die es lernen wollen noch am ball sind ? keine ahnung .

ICh würde jetzt mal auf den simulator eingehen , da die 1-2 Leute die hier mitmachen wollten doch noch gar keine Hardware haben.
Aber mach mal weiter - wird sich dann bestimmt gut auf deiner HP machen wenns fertig ist.

Gruß

_________________
Eine Weiterverbreitung ohne ausdrückliche Genehmigung ist untersagt. Für Schäden, lehnen wir jegliche Haftung ab.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
gerold



Anmeldungsdatum: 27.07.2007
Beiträge: 927
Wohnort: Oberhofen im Inntal (Tirol)

BeitragVerfasst am: Fr 14.März 2008 12:29:42    Titel: Label, Unterprozeduren und Funktionen Bauteile finden Antworten mit Zitat

Hallo!

Bevor ich weitere Möglichkeiten zeigen kann, wie man Signale an Eingängen erkennt, muss ich noch auf die Strukturierung von Programmen eingehen, ohne die ich in weiteren Beispielen nicht auskomme.

Es ist ziemlich schlechter Stil, einfach alle Befehle in einer Wurst untereinander zu schreiben. So etwas nennt man unter Programmierern "Spagetticode". Der Nachteil von Spagetticode ist, dass er nicht wartbar ist. Fehler lassen sich kaum finden und spätestens nach ein paar Wochen ist man oft schneller wenn man ein Programm neu schreibt anstatt dieses an geänderte Anforderungen anzupassen.

Natürlich ist man bei der Programmierung von µControllern sehr eingeschränkt und kann nicht mit Klassen oder anderen Strukturierungsmöglichkeiten arbeiten, die in der Anwendungsprogrammierung ganz normal sind.

Trotz der Speichereinschränkungen mancher µController, gibt es in Bascom Möglichkeiten, ein wenig Struktur in das Programm zu bringen. Es gibt so genannte "Label", die man von beliebigen Codestellen aus anspringen kann, Unterprozeduren (Sub) und Funktionen.

Ein Label ist eine "benannte" Stelle im Code. Diese Stelle kann mit dem Befehl GOTO angesprungen werden. Das Programm springt dann zu dieser benannten Stelle und arbeitet den Code ab dieser Stelle ab. GOTO ist die niederste Anweisung für so etwas. Springt man mit GOTO ein Label an, dann gibt es keine dynamische Möglichkeit, zur ursprünglichen Codezeile zurück zu kehren. Damit meine ich, dass sich der µC nicht merkt, von wo aus zum Label gesprungen wurde um danach wieder zurück zu springen. Dafür braucht GOTO keinen zusätzlichen Speicher um sich diese Information zu merken.

http://avrhelp.mcselec.com/index.html?goto.htm

Code:
Dim A As Byte


Start:

A = A + 1
If A < 10 Then
  Goto Start
End If

Print "Fertig"


End

GOTO ist ein alter und sehr umstrittener Befehl. GOTO gilt allgemein als das größte Problem von BASIC. Je öfter mit GOTO irgendwohin gesprungen wird, desto schwieriger wird es dem Programmierer dem Programmverlauf zu folgen. Meide GOTO wenn ein Problem auch anders gelöst werden kann! Verwende GOTO wenn dadurch das Programm einfacher wird (und das wird nur sehr selten der Fall sein).

Man kann ein Label auch mit dem Befehl GOSUB anspringen. GOSUB ist schon einen Level höher als GOTO. Bevor ein Label mit GOSUB angesprungen wird, wird im HWSTACK (=Stapelspeicher) die Adresse des aktuell ausgeführten Befehls (=Programmzeiger) abgespeichert. Diese Information wird benötigt, um nach einem RETURN wieder zu dieser Stelle zurückkehren zu können. Der Befehl RETURN veranlasst die Rückkehr zur Stelle, von der aus das Label mit GOSUB angesprungen wurde.
Du wirst dich vielleicht schon gewundert haben, was dieses ``$hwstack = 32`` am Anfang jedes Programmes soll. Damit wird die Größe dieses Stapelspeichers festgelegt. Je mehr hin und her gesprungen wird, desto größer muss dieser Speicherbereich sein.

http://avrhelp.mcselec.com/index.html?gosub.htm

Dieses Beispiel geht davon aus, dass an PD5, PD6 und PD7 LEDs angeschlossen sind. Im Beispiel sieht man recht gut, dass mit GOSUB zum Label gesprungen wird und mit RETURN zum Aufrufpunkt zurückgekehrt wird.
Code:
$regfile = "M8def.dat"
$crystal = 1000000
$hwstack = 32
$swstack = 10
$framesize = 40


'LED1 an PD7
Led1 Alias Portd.7
Config Led1 = Output

'LED2 an PD6
Led2 Alias Portd.6
Config Led2 = Output

'LED3 an PD5
Led3 Alias Portd.5
Config Led3 = Output

Dim Status As Byte


Do
   If Status = 0 Then
      Gosub Set_led1
      Status = 1
   Elseif Status = 1 Then
      Gosub Set_led2
      Status = 2
   Elseif Status = 2 Then
      Gosub Set_led3
      Status = 3
   Elseif Status = 3 Then
      Gosub Set_led3
      Status = 4
   Elseif Status = 4 Then
      Gosub Set_led2
      Status = 5
   Else
      Gosub Set_led1
      Status = 0
   End If

   Waitms 200
Loop

End


Set_led1:
   Led1 = 1
   Led2 = 0
   Led3 = 0
Return


Set_led2:
   Led1 = 0
   Led2 = 1
   Led3 = 0
Return


Set_led3:
   Led1 = 0
   Led2 = 0
   Led3 = 1
Return

Anmerkung: Um sich die vielen IF-Abfragen sparen zu können, würde man eine FOR-Schleife einsetzen. Darüber habe ich noch nichts geschrieben, aber das Programm würde damit kürzer werden -- später mehr.

An dieser Stelle möchte ich auch die Highlevel-Befehle "SUB" und "FUNCTION" ansprechen.

Je größer das Programm wird das man schreibt, desto wichtiger werden die Befehle SUB und FUNCTION. Damit kann man abgeschlossene Programmbereiche (Unterprozeduren und Funktionen) erstellen, die sogar ihre eigenen "lokalen" Variablen besitzen können. Lokale Variablen sind außerhalb dieser Unterprozeduren und Funktionen nicht sichtbar und können somit den Programmablauf nicht beeinflussen. Und genau das wird immer wichtiger, je größer ein Programm wird. Je weniger ein Programmteil einen anderen Programmteil beeinflussen kann, desto weniger Fehler werden übersehen.

Eine Unterprozedur oder eine Funktion muss Bascom im Kopf des Programms mit DECLARE bekannt gemacht werden. Eine Unterprozedur oder eine Funktion kann Parameter übergeben bekommen. Eine Funktion kann zusätzlich auch noch Werte zurück geben.

Code:
$regfile = "M8def.dat"
$crystal = 1000000
$hwstack = 32
$swstack = 10
$framesize = 40


'LED1 an PD7
Led1 Alias Portd.7
Config Led1 = Output

'LED2 an PD6
Led2 Alias Portd.6
Config Led2 = Output

'LED3 an PD5
Led3 Alias Portd.5
Config Led3 = Output

'Prozedur deklarieren
Declare Sub Set_led(byval Led_id As Byte)

Dim Status As Byte


Do
   If Status = 0 Then
      Call Set_led(1)
      Status = 1
   Elseif Status = 1 Then
      Call Set_led(2)
      Status = 2
   Elseif Status = 2 Then
      Call Set_led(3)
      Status = 3
   Elseif Status = 3 Then
      Call Set_led(3)
      Status = 4
   Elseif Status = 4 Then
      Call Set_led(2)
      Status = 5
   Else
      Call Set_led(1)
      Status = 0
   End If

   Waitms 200
Loop

End


Sub Set_led(byval Led_id As Byte)
   Led1 = 0
   Led2 = 0
   Led3 = 0

   If Led_id = 1 Then
      Led1 = 1
   Elseif Led_id = 2 Then
      Led2 = 1
   Else
      Led3 = 1
   End If
End Sub

Um genauer auf SUB und FUNCTION eingehen zu können, brauche ich einen oder zwei zusätzliche Beiträge hier im Forum -- später kommt mehr.

mfg
Gerold
Smile

_________________
http://halvar.at | http://sw3.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.


Zuletzt bearbeitet von gerold am Fr 04.Apr 2008 14:53:08, insgesamt 5-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
gerold



Anmeldungsdatum: 27.07.2007
Beiträge: 927
Wohnort: Oberhofen im Inntal (Tirol)

BeitragVerfasst am: Fr 14.März 2008 13:03:26    Titel: Bauteile finden Antworten mit Zitat

BellaD hat folgendes geschrieben:
ICh würde jetzt mal auf den simulator eingehen , da die 1-2 Leute die hier mitmachen wollten doch noch gar keine Hardware haben.

Hallo BellaD!

Ja, auf den sollte ich endlich mal eingehen. Ich weiß nur noch nicht wie. Dieses Ding ist umfangreich und mit Fallen bestückt, die einem das Leben nicht immer einfacher machen.

mfg
Gerold
Smile

_________________
http://halvar.at | http://sw3.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
gerold



Anmeldungsdatum: 27.07.2007
Beiträge: 927
Wohnort: Oberhofen im Inntal (Tirol)

BeitragVerfasst am: Fr 14.März 2008 16:55:08    Titel: Interrupts Bauteile finden Antworten mit Zitat

Hallo!

Du hat ja bereits BITWAIT kennen gelernt. Damit kann man auf einen Tastendruck warten und daraufhin mit dem Programm fortfahren. Der Nachteil liegt auf der Hand: "Das Programm bleibt stehen, bis die Taste gedrückt wurde. Genau deshalb ist es sehr selten, dass man BITWAIT in Programmen antrifft.

Wenn das an einen Pin anliegende Signal nicht nachprellt, also z.B. von einem entprellten Taster stammt, dann kann man das Signal vom µC beobachten lassen. Tritt das Signal auf, dann unterbricht der µC die aktuelle Programmausführung und springt zu einem vorher bestimmten Label. Der Code unterhalb des Labels wird abgearbeitet und bei RETURN springt der Programmzeiger wieder zurück zur vorher verlassenen Stelle.

Der Vorteil liegt auf der Hand. Das Programm läuft und läuft und läuft. Nur dann, wenn sich auch wirklich etwas am beobachteten Pin tut, dann wird der dazupassene Code ausgeführt. Das nennt man "Interrupt" oder "Interrupt Request" und das Label, welches bei so einem Interrupt Request angesprungen wird, nennt man "Interrupt Handler" oder "Interrupt Request Handler".

So ein Interrupt unterbricht das laufende Programm. Setzt man Interrupts ein, muss man das Programm so schreiben, dass es an jeder Stelle egal ist, wenn die Ausführung mal kurz unterbrochen wird. -- Man kann sich aber auch absichern und Codeteile die nicht durch einen Interrupt unterbrochen werden dürfen vor so einer Unterbrechung schützen. Man kann mögliche Unterbrechungen einfach dadurch umgehen, indem man vor so einem Codeteil die Unterbrechung durch Interrupts ausschaltet und danach wieder einschaltet. Der µC merkt sich die in der Zwischenzeit anfallenden Interrupts und arbeitet sie danach ab.

Das Einfachste aber ist, wenn man in einem Interrupt-Handler nichts macht was lange dauert. Idealerweise setzt man in einem Interrupt-Handler eine Variable und kümmert sich um die restliche Abarbeitung des Jobs in der Hauptschleife.

Es gibt beim ATmega8 zwei Pins, die so einen Interrupt auslösen können. INT0 und INT1. Wenn man sich den Anschlussplan im ATmega8-Datenblatt auf Seite 2 ansieht, dann findet man heraus, dass INT0 der Pin PD2 und INT1 der Pin PD3 ist. Dieses Wissen können wir jetzt dafür nutzen, um eine LED bei einem Tastendruck ein und bei erneutem Tastendruck auszuschalten. Und um zu beweisen, dass die Hauptschleife währenddessen weiter läuft, lassen wir eine zweite LED in der MainLoop blinken.

Zum Testen genügt diese Schaltung:


Ein neuer Befehl wird eingeführt: TOGGLE
TOGGLE entspricht (in etwa) dieser Befehlsfolge:
Code:
IF bit_variable = 0 THEN
    bit_variable = 1
ELSE
    bit_variable = 0
END


Die neuen Befehle sind im Code beschrieben.
Code:
$regfile = "M8def.dat"
$crystal = 1000000
$hwstack = 32
$swstack = 10
$framesize = 40


'LED1 an PD7
Led1 Alias Portd.7
Config Led1 = Output

'LED2 an PD6
Led2 Alias Portd.6
Config Led2 = Output

'TASTER1 an PD2
Taster1 Alias Pind.2
Config Pind.2 = Input
Portd.2 = 1       'PullUp-Widerstand einschalten

'Wenn der Interrupt INT0 auftritt, dann springe zum Label "On_int0"
On Int0 On_int0

'Der Interrupt INT0 wird ausgelöst wenn der Pin PD2 gegen GND gezogen wird.
'Also beim Übergang von HIGH nach LOW. Der Interrupt wird nicht ausgelöst, wenn
'der Pin bereits gegen GND zieht.
Config Int0 = Falling       'fallende Flanke

'INT0 einschalten
Enable Int0

'Interrupts global einschalten. Das ist der Hauptschalter für alle Interrupts
Enable Interrupts


Do
   Toggle Led1
   Waitms 200
Loop

End


On_int0:
   Toggle Led2
Return


Fragen?

mfg
Gerold
Smile

_________________
http://halvar.at | http://sw3.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
gerold



Anmeldungsdatum: 27.07.2007
Beiträge: 927
Wohnort: Oberhofen im Inntal (Tirol)

BeitragVerfasst am: Fr 14.März 2008 17:54:32    Titel: AVR im KFZ-Board Bauteile finden Antworten mit Zitat

Hallo!

Wie ist das denn so in einem Auto? Dort hat man 12 V (13,8 V) aber keine 5 Volt, die man an einen Pin des ATmega8 legen kann. Also muss ein Spannungsteiler her. Und damit evt. auftretende Spannungsspitzen dem µC nichts anhaben können, würde ich noch eine Z-Diode an die Leitung legen.

Version 1:

Version 2:


Und der AVR muss auch ein wenig besser als normal geschützt werden. Die Stromversorgung in einem KFZ-Boardnetz könnte so aussehen:



Das sollte man sich zu diesem Thema unbedingt durchlesen: http://www.dse-faq.elektronik-kompendium.de/dse-faq.htm#F.23

mfg
Gerold
Smile

PS: Bessere Schaltungsvorschläge sind ausdrücklich erwünscht.

_________________
http://halvar.at | http://sw3.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.


Zuletzt bearbeitet von gerold am Do 26.Jun 2008 10:07:09, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
passat2001



Anmeldungsdatum: 05.03.2008
Beiträge: 5

BeitragVerfasst am: Fr 14.März 2008 19:45:45    Titel: Bauteile finden Antworten mit Zitat

Hi. Sorry, das ich mich so lange nicht gemeldet habe. bin momentan leider beruflich unterwegs (montage). werde erst am Karfreitag wieder zeit finden. Nicht böse sein, lese mir dann alles weiter wieder durch....
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
gerold



Anmeldungsdatum: 27.07.2007
Beiträge: 927
Wohnort: Oberhofen im Inntal (Tirol)

BeitragVerfasst am: Fr 14.März 2008 21:38:30    Titel: Bauteile finden Antworten mit Zitat

passat2001 hat folgendes geschrieben:
Hi. Sorry, das ich mich so lange nicht gemeldet habe. bin momentan leider beruflich unterwegs (montage). werde erst am Karfreitag wieder zeit finden. Nicht böse sein, lese mir dann alles weiter wieder durch....

Hallo passat2001!

Kein Problem. Smile Lies dir wenn du wieder Zeit hast die Beiträge durch. Baue dir die Testschaltungen auf und probiere die Programme aus. Eigentlich sollten schon genug Informationen zur Verfügung stehen, dass du einfache Logikschaltungen für das Auto mit dem ATmega8 realisieren kannst. Und wenn du Fragen hast -- raus damit! Die AVRs können noch viel mehr als ich bis jetzt beschrieben habe.

@all: Wenn du ein besonderes Thema anschneiden möchtest, dann lasst es mich wissen. Oder wenn du eine Idee für eine kleine Beispielanwendung hast, dann lass es mich wissen. Rückmeldungen sind sehr wichtig für mich. Ich helfe gerne, aber dafür möchte ich auch wissen, wieviele sich dafür interssieren. Es treibt mich an und freut mich, wenn ich von euch höre.

mfg
Gerold
Smile

_________________
http://halvar.at | http://sw3.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
gerold



Anmeldungsdatum: 27.07.2007
Beiträge: 927
Wohnort: Oberhofen im Inntal (Tirol)

BeitragVerfasst am: Fr 14.März 2008 21:43:01    Titel: Einen Taster softwareseitig entprellen Bauteile finden Antworten mit Zitat

Hallo!

In diesem Beitrag möchte ich auf die Möglichkeit eingehen, einen Taster softwareseitig zu entprellen. Also als Ersatz für den, in früheren Beiträgen, eingeführten 10 n Kondensator, den man parallel zum Schalter löten kann.

Der Kondensator ist eine feine Sache und oft gibt es auch keine andere Möglichkeit um zu einem sauberen Signal zu kommen.
Aber manchmal möchte man Bauteile sparen oder man hat zu wenig Platz für die zusätzlichen Kondensatoren oder man hat einfach keine Lust, sich einen Kondensator raus zu suchen. Wink Für diese Fälle gibt es eine in Bascom eingebaute High-Level-Prozedur: DEBOUNCE

http://avrhelp.mcselec.com/index.html?debounce.htm

An DEBOUNCE übergibt man als Parameter den Pin an dem der Taster hängt. Dann kann man noch angeben, ob bei einer HIGH-LOW-Flanke (0) oder bei einer LOW-HIGH-Flanke (1) die Taste als gedrückt gilt. Als dritten Parameter gibt man an, wohin das Programm springen soll, wenn ein Tastendruck erkannt wurde. Und als vierten Parameter kann man mit dem Wort "SUB" angeben ob für den Sprung zum Label der Befehl GOTO oder GOSUB verwendet werden soll. Lässt man "SUB" weg, dann wird GOTO verwendet. Fügt man "SUB" an, dann wird GOSUB verwendet. Bei Verwendung von GOSUB wird das Programm bei einem RETURN wieder an der ursprünglichen Position fortgesetzt.

DEBOUCE ist ein Befehl den man in einer Schleife benutzt. Es wird also nicht wie beim Interrupt alles der Hardware überlassen. DEBOUNCE merkt sich im Hintergrund den aktuellen Status des zu überwachenden Pins und wird aktiv wenn sich das Signal geändert hat. Ändert sich das Signal nicht, dann wird ganz normal mit dem nächsten Befehl fortgefahren. Hat sich das Signal geändert, dann wartet DEBOUNCE 25 Millisekunden und prüft dann den Pin noch einmal ab. Ist der Pin nach 25 Millisekunden immer noch im Schaltzustand, dann springt DEBOUNCE zum angegebenen Label. Mit ``CONFIG DEBOUNCE`` kann man diese Wartezeit einstellen.

Code:
$regfile = "M8def.dat"
$crystal = 1000000
$hwstack = 32
$swstack = 10
$framesize = 40


'LED1 an PD7
Led1 Alias Portd.7
Config Led1 = Output

'LED2 an PD6
Led2 Alias Portd.6
Config Led2 = Output

'LED3 an PD5
Led3 Alias Portd.5
Config Led3 = Output

'TASTER1 an PD2
Taster1 Alias Pind.2
Config Pind.2 = Input
Portd.2 = 1       'PullUp-Widerstand einschalten


Do
   Debounce Taster1 , 0 , On_taster1 , Sub
Loop

End


On_taster1:
   If Led1 = 0 Then
      Led1 = 1
      Led2 = 0
   Else
      Led1 = 0
      Led2 = 1
   End If
Return

DEBOUNCE hat auch seine Nachteile, die ich hier nicht verschweigen möchte. Am Einfachsten ist es, wenn man zum Demonstrieren ein Beispiel heran zieht.

Tausche den Code der MainLoop
Code:
Do
   Debounce Taster1 , 0 , On_taster1 , Sub
Loop

durch diesen Code aus
Code:
Do
   Debounce Taster1 , 0 , On_taster1 , Sub
   Toggle Led3
Loop

Damit wird LED3 in der MainLoop ständig ein- und ausgeschaltet. Das geht so schnell, dass das Auge das nicht mehr mitbekommt. Für uns leuchtet die LED ständig. Wenn man jetzt den Taster mehrmals hintereinander drückt, dann flackert die LED3 jedes mal ein wenig. Das kommt daher, weil beim Erkennen eines Tastendrucks von DEBOUNCE 25 ms gewartet wird. Wärend dieser 25 ms wird die LED nicht mehr getoggelt und das ist dieses Flackern. Das Programm wird bei Tastendruck für 25 ms angehalten.

Tausche den Code der MainLoop jetzt durch diesen Code aus:
Code:
Do
   Debounce Taster1 , 0 , On_taster1 , Sub
   Waitms 400
   Toggle Led3
Loop

Was passiert hier? LED3 blinkt. Zwischen jedem Toggeln der LED3 werden im Programm 400 Millisekunden gewartet. Während dieser 400 Millisekunden hat DEBOUNCE keine Chance einen Tastendruck zu ermitteln, da es schlicht und einfach viel zu wenig oft ausgeführt wird um eine Änderung zu erkennen. Ganz langsame Tastenanschläge werden erkannt. Aber je schneller man die Taste drückt desto mehr Anschläge gehen verloren.

Wird es als Störung empfunden wenn DEBOUNCE das Programm 25 ms lahm legt, oder ist der µC sehr ausgelastet und wird ständig am Limit betrieben, oder wird öfter im Programm mit WAIT oder WAITMS gewartet, dann ist DEBOUNCE nicht geeignet um einen Tastendruck zu erkennen. In solchen Fällen sollte man auf einen der beiden Interrupts (INT0, INT1) oder eine andere Möglichkeit ausweichen.

mfg
Gerold
Smile

_________________
http://halvar.at | http://sw3.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
caargoo



Anmeldungsdatum: 27.05.2007
Beiträge: 25
Wohnort: Ö - B

BeitragVerfasst am: Sa 15.März 2008 08:11:33    Titel: Hallo Gerold! Bauteile finden Antworten mit Zitat

Hier ist noch ein begeisterter Mitleser aus flachen Ende Österreichs.
Komme fast gar nicht dazu auf dem laufenden zu bleiben. Wenn ich mal reinschaue gibts schon wieder 2 - 3 neue Beiträge von Dir, was Dich aber nicht hindern soll so weiter zu machen.
Hab zwar schon einige Jahre mehr am Buckel, aber trotzdem möchte ich mich ein bißchen
mit µC u. BASCOM beschäftigen wenns die karge Freizeit erlaubt.

Weiter so und ich bleib sicher am Ball!

Mit freundlichen Grüßen aus SüdOsten Österreichs
caargoo
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
gerold



Anmeldungsdatum: 27.07.2007
Beiträge: 927
Wohnort: Oberhofen im Inntal (Tirol)

BeitragVerfasst am: Sa 15.März 2008 10:39:59    Titel: Re: Hallo Gerold! Bauteile finden Antworten mit Zitat

caargoo hat folgendes geschrieben:
Hier ist noch ein begeisterter Mitleser aus flachen Ende Österreichs.

Hallo caargoo!

Danke, das freut mich! Smile

mfg
Gerold
Smile

_________________
http://halvar.at | http://sw3.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
gerold



Anmeldungsdatum: 27.07.2007
Beiträge: 927
Wohnort: Oberhofen im Inntal (Tirol)

BeitragVerfasst am: So 16.März 2008 16:23:58    Titel: Fuse-Bits und Lock-Bits - Teil 1 Bauteile finden Antworten mit Zitat

Hallo!

Jetzt möchte ich ein Thema erklären, welches von vielen ungern angesprochen wird. Aber so undurchsichtig ist es eigentlich gar nicht -- wenn man die richtigen Werkzeuge zur Hand hat oder ein wenig im Datenblatt des jeweiligen µC stöbert. Ich spreche von den Fuse-Bits und den Lock-Bits.

Die Fuse-Bits und Lock-Bits sind die Grundeinstellungen des AVR-Mikrocontrollers. Diese Grundeinstellungen werden nicht beim normalen Übertragen eines Programmes geändert oder gelöscht. Unter anderem wird in diesen Grundeinstellungen festgelegt, ob der µC mit dem internen RC-Oszillator oder mit einem externen Quarz betrieben wird.

Der ATmega8 hat einen RC-Oscillator eingebaut. Dieser liefert in der Basiseinstellung einen Takt von 1 Mhz. Diese Basiseinstellung kann man verändern. Z.B. so, dass der interne RC-Oszillator mit 8 Mhz und nicht mehr mit 1 Mhz läuft. Das ist noch nicht schlimm. Aber damit kann man auch einstellen, dass der Takt von einem externen Quarz oder Oszillator kommt. Hat man das so eingestellt und schließt keinen Quarz an, dann läuft der µC nicht bis ein Quarz angeschlossen wird.

Die Fuse- und Lock-Bits können mit einem Programmer verändert werden. Ist der Programmer ein ISP-Programmer (In System Programming), dann kann man alle Einstellungen, bis auf die Einstellung die dafür zuständig ist, dass man den µC per ISP programmieren kann, verändern.

Die Fuse-Bits für den Systemtakt werden sehr detailliert im Kapitel "System Clock and Clock Options" (Seite 23) im detaillierten ATmega8-Datenblatt erklärt. Dann gibt es noch Einstellungen, die den Brown Out Detektor, den Watchdog Timer und den Boot Loader betreffen. Das haben wir noch nicht besprochen, deshalb gehe ich jetzt nicht näher darauf ein. Es gibt da noch eine Einstellung mit der man den Reset-Pin in einen normalen I/O-Pin umschalten kann. Wenn man das macht, dann kann der µC nicht mehr über ISP programmiert werden. Also Finger weg von der Einstellung mit dem Namen "RSTDISBL". Das kann man nur wieder umstellen, wenn man den µC mit einem speziellen Programmer (z.B. dem AVR-Dragon) programmiert.

Dann gibt es noch die Lock-Bits. Mit diesen Einstellungen kann man z.B. den Programmcode vor dem Auslesen schützen. Der eingebaute EEPROM-Speicher kann auch geschützt werden. Die Lock-Bits werden im detaillierten ATmega8-Datenblatt im Kapitel "Program And Data Memory Lock Bits" (Seite 219) aufgelistet.

Das Verwirrende bei den Fuse- und Lock-Bits ist, dass eine 1 bedeutet, dass die Einstellung NICHT gesetzt ist und eine 0 bedeutet, dass die Einstellung GESETZT ist. Es ist also genau umgekehrt als das was wir gewohnt sind.

Bei den Lock-Bits kann man nichts falsch machen wenn man sie einfach unprogrammiert (auf 1 gesetzt) lässt. Deshalb werde ich nicht weiter darauf eingehen. Wer mehr darüber wissen will, sollte sich im ATmega8-Datenblatt darüber informieren.

Die Lock- und Fuse-Bits werden im detaillierten Datenblatt des ATmega8 im Kapitel "Memory Programming" (Seite 219) genau erklärt.

Die Fuse-Bits befinden sich in zwei Registern. Es handelt sich also um 16 Einstellungen (einzelne Bits) die auf 0 oder 1 gesetzt werden können. Diese zwei Register werden in den verschiedenen Programmen oft "High Byte" und "Low Byte" genannt. Diese werden in den Programmen, die man zum Einstellen der Fuse-Bits verwenden kann, auch manchmal einzeln angezeigt.

Im Fuse High Byte des ATmega8 befinden sich diese Einstellungen:


Im Fuse Low Byte des ATmega8 befinden sich diese Einstellungen:


Wichtig! Wenn man nicht weiß, wie ein Bit eingestellt werden soll, dann sollte man die in diesen Tabellen aufgezeigte Standardeinstellung verwenden.

Die gleichnamigen Bits, wie z.B. SUT1 und SUT0 bilden zusammen eine Einstellung. Und wenn man wissen will was eine Einstellung genau bewirkt, dann sollte man das ATmega8-Datenblatt nach dieser Einstellung durchsuchen. Das funktioniert mit allen gängigen PDF-Reader wie z.B. dem "Foxit Reader" oder dem "Adobe Reader".

Im nächsten Beitrag erkläre ich, wie man mit dem mySmartUSB die Fuse-Bits einstellen kann.

mfg
Gerold
Smile

_________________
http://halvar.at | http://sw3.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.


Zuletzt bearbeitet von gerold am Fr 28.März 2008 13:49:34, insgesamt 3-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
gerold



Anmeldungsdatum: 27.07.2007
Beiträge: 927
Wohnort: Oberhofen im Inntal (Tirol)

BeitragVerfasst am: Mo 17.März 2008 15:03:42    Titel: Fuse-Bits und Lock-Bits - Teil 2 Bauteile finden Antworten mit Zitat

Hallo!

Zum mySmartUSB gehört auch das Programm "myAVR ProgTool Version 1.01". Damit kann man die Fuse-Bits einstellen. Aber das ist derzeit so schlecht und unpraktisch gelöst, dass es quasi nicht benutzbar ist. Man hat mir zugesagt, dass es in ein paar Wochen eine neue Version dieses Tools geben soll. Bis dahin empfehle ich nicht dieses Tool, sondern die Demo Version des Programmes "myAVR WorkpadPLUS" zum Einstellen der Fuse-Bits zu verwenden.

Zuerst holt man sich die aktuelle Demo Version die man unter der Adresse http://myavr.de/download.php herunterladen kann. Suche dort einfach nach "myAVR Workpad PLUS". Während ich diesen Beitrag schreibe ist dort die "myAVR Workpad PLUS, Demo Version 1.4" aktuell. Nach dem Herunterladen kann das Programm wie üblich installiert werden.

Dann sollte man den mySmartUSB einstecken und an diesen einen ATmega8 anschließen. Z.B. über eines der empfohlenen Experimentierboards oder über ein Steckbrett. Dann kann man das Programm starten.

Über das Menü "Extras/Einstellungen" kommt man in das Fenster "Optionen - myAVR Workpad PLUS". In diesem kann man nun den "mySmartUSB" auswählen und testen. Links unten kann man noch den angeschlossenen Controller auswählen. Das sollte der "ATmega8" sein. Mit einem Klick auf die Schaltfläche "Speichern", werden die Einstellungen gespeichert und kehrt zum Hauptfenster zurück.

Siehe: Bild von den Einstellungen

Zu den Fuse-Bits kommt man über das Menü "Extras/Fuse- und Lock-Bits". Wenn der µC erkannt wird, dann sollte das Fenster in etwa so aussehen: Bild vom Fenster "Fuse- & Lock-Bits"

Brown-Out:

Mit einem Häckchen bei "Brown-out detection enabled" kann man den Brown-Out-Detektor einschalten. Dieser schaltet den µC in den Reset-Modus, solange die hier angegebene Spannung unterschritten wird. Wenn das Programm nur dann korrekt funktioniert wenn die Versorgungsspannung passt, dann ist die Brown-Out-Erkennung eine feine Sache. Z.B. braucht das Schreiben von Daten in den EEPROM eine Mindestspannung und würde nicht funktionieren wenn diese unterschritten wird. Es könnte z.B. sein, dass sich die Spannung beim Einschalten des Gerätes langsam aufbaut weil vielleicht ein großer Kondensator geladen werden muss. In so einem Fall kann man Brown-Out aktivieren, um das Programm erst dann starten zu lassen, wenn die benötigte Spannung am µC anliegt.

Ext-Clock:

Mit diesen drei Einstellungen kann man den µC so einstellen, dass dieser seinen Takt von einem externen Taktgeber erhält. Diese Einstellung sagt dem µC, dass ein eigenständiges Taktsignal von einem Oszillator kommt -- bitte nicht mit einem Quarz verwechseln. Für einen Quarz gibt es andere Einstellungen.

Setzt man zusätzlich auf der nächsten Seite bei der Einstellung CKOPT ein Häckchen, dann wird ein eingebauter 36 pF Kondensator zwischen XTAL1 und GND aktiviert. Das Häckchen bei CKOPT sollte bei diesen drei Einstellungen normalerweise nicht gesetzt sein.

Detaillierte Informationen darüber findet man im ATmega8-Datenblatt im Kapitel "External Clock" (Seite 30).

Die Angaben "6 CK + 0 ms", "6 CK + 4 ms" und "6 CK + 64 ms" geben an, wie lange der µC dem Oszillator Zeit geben soll um sich einzuschwingen. Viele Oscillatoren brauchen ein wenig Zeit bevor diese im richtigen Takt schwingen. Damit in dieser Zeit keine zeitkritischen Dinge vom µC erledigt werden, wartet der µC die angegebene Zeit ab bevor das Programm gestartet wird. Wenn es nicht wichtig ist, dass der µC sehr schnell nach dem Anlegen der Spannung verfügbar ist, dann sollte man dem Oszillator die maximale Zeit zum Einschwingen geben. Wenn es wichtig ist, dass der µC so schnell wie möglich verfügbar ist, dann sollte man zuerst das Kapitel darüber im Datenblatt lesen bevor man die Einschwingzeit verkürzt. Die hiermit eingestellte Einschwingzeit gilt auch für das Aufwachen des µC, wenn man diesen vorher in einen Schlafmodus gesetzt hat. Dieser Absatz gilt für alle weiteren, hier aufgeführten Clock-Einstellungen und wird für die anderen Einstellungen nicht mehr gesondert erklärt.

Int. RC Osc.:

Mit diesen Einstellungen stellt man den µC so ein, dass dieser ohne externen Oscillator oder Quarz funktioniert. Es wird der in den µC eingebaute RC-Oscillator verwendet. Dieser eingebaute RC-Oscillator kann auf 1, 2, 4 und 8 Mhz eingestellt werden. Die Standardeinstellung ist 1 Mhz. Das ist nicht sonderlich schnell, braucht aber weniger Strom als eine hohe Frequenz. Je höher die Frequenz, desto öfter wird das Programm durchlaufen. Desto öfter werden Messungen vorgenommen und Pins auf HIGH oder LOW gesetzt. Die Frequenz kann bis zu 3% (1% wenn kalibriert) von der Vorgabe abweichen. Der eingebaute RC-Oscillator kann nie so genau wie ein Quarz sein. Aber für viele, nein sogar für die allermeisten, Anwendungen wird der eingebaute RC-Oscillator genügen. Wählt man eine dieser Einstellungen, dann muss auf der nächsten Seite das Häckchen von der Einstellung CKOPT entfernt werden, damit nicht noch zusätzlich die eingebauten 36 pF Kondensatoren aktiviert werden.

Da ich in den nächsten Beiträgen vermehrt auf die Verbindung zwischen µC und Computer über RS-232 eingehen werde, ist es interessant, hier auf 8 Mhz zu stellen. Warum das für die Kommunikation mit dem Computer besser als 1 Mhz ist werden ich später erklären.

Ext. RC Osc.:

Man kann mit einem Widerstand (R) und einem Kondensator (C) einen eigenen RC-Oscillator aufbauen. Je nach Größe des Widerstands und Kapazität des Kondensators schwingt dieser RC-Oscillator in verschieden hohen Frequenzen. Um einen externen RC-Oscillator als Taktgeber zu verwenden, nimmt man diese Einstellungen. Es muss nur noch angegeben werden, wie hoch in etwa die Frequenz des RC-Oscillators ist, damit sich der µC intern besser auf die Frequenz einstellen kann. Setzt man auf der nächsten Seite ein Häckchen bei CKOPT, dann wird zwischen XTAL1 und GND ein 36 pF Kondensator aktiviert. So kann man den externen RC-Oscillator mit nur einem Widerstand aufbauen. Ein Schaltplan dafür ist im ATmega8-Datenblatt zu finden.

Ext. Low-Freq. Crystal:

Diese Einstellung nimmt man, wenn man einen 32.768 Hz Uhrenquarz anschließt. Setzt man auf der nächsten Seite das Häckchen bei der Einstellung CKOPT, dann kann man sich die externen Kondensatoren sparen. Mit CKOPT werden die internen 36 pF Kondensatoren an den Pins XTAL1 und XTAL2 aktiviert.

Ext. Cristal/Resonator:

Damit kann man an die Pins XTAL1 und XTAL2 einen Quarz anschließen. Beide Pins des Quarz müssen mit jeweils einem 22 pF Keramikkondensator gegen GND geschaltet werden.



Damit ist es möglich, den µC sehr genau zu takten. Das ist für die verschiedensten Anwendungen wichtig. Z.B. wenn man eine Frequenz messen oder eine genaue Frequenz erzeugen möchte. Oder wenn mit hoher Geschwindigkeit mit dem Computer oder mit anderen µControllern kommuniziert wird. Der interne RC-Oscillator kann maximal 8 Mhz erzeugen. Mit einem externen Quarz kann der µC mit bis zu 16 Mhz betrieben werden.

Low Freq.:
- 0,4 bis 0,9 Mhz
- nur Keramik-Oszillator

Medium Freq.:
- 0,9 bis 3 Mhz

High Freq.:
- 3-8 Mhz
- mit einem Häckchen bei CKOPT bis zu 16 Mhz

Um einen Quarz mit einer Frequenz zwischen 8 und 16 Mhz anschließen zu können, muss ein Häckchen bei der Einstellung CKOPT (auf der nächsten Seite) gesetzt werden.

Nachdem die Fuse-Bits umgestellt wurden, muss der µC kurz von der Versorgungsspannung getrennt werden.

Noch Fragen?

mfg
Gerold
Smile

_________________
http://halvar.at | http://sw3.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.


Zuletzt bearbeitet von gerold am Mo 17.März 2008 22:28:32, insgesamt 4-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
gerold



Anmeldungsdatum: 27.07.2007
Beiträge: 927
Wohnort: Oberhofen im Inntal (Tirol)

BeitragVerfasst am: Mo 17.März 2008 17:31:34    Titel: Fuse-Bits und Lock-Bits - Teil 3 Bauteile finden Antworten mit Zitat

Hallo!

Das Low-Byte der Fuses wurde im letzten Beitrag erklärt. Jetzt ist das High-Byte dran.



Reset Disabled:
Damit wird aus dem Reset-Pin (PC6) ein normaler I/O-Pin. Man hat damit zwar einen Pin mehr zur Verfügung, kann den µC aber nicht mehr über ISP programmieren.

Watch-dog Timer always on:
Über den Watch-dog Timer haben wir noch nicht gesprochen. Aber vorab: Damit prüft man in gewissen Zeitabständen ob der µC noch reagiert. Wenn nicht, dann wird ein Reset ausgelöst. Dazu muss man im Programm selber immer wieder den Timer zurück setzen. Der Watch-dog Timer funktioniert auch ohne diese Einstellung. Und ein Programm das nicht ständig den Watch-dog Timer zurück setzt, läuft mit dieser Einstellung sowiso nicht. Also -- immer ausgeschaltet lassen.

Serial program downloading (SPI) enabled:
Ist diese Einstellung gesetzt, dann kann der µC per SPI programmiert werden.

Preserve EEPROM memory through the Chip Erase cycle:
Mit den Programmen, mit denen man ein Programm vom Computer zum µC überträgt, kann man auch den gesamten µC löschen. Um zu verhindern, dass damit auch der EEPROM des µC gelöscht wird, kann man diese Einstellung setzen.

Boot Flash section size:
Das ist für uns nicht wichtig. (Wenn es dich interessiert: siehe Datenblatt)

Boot Reset vector Enabled:
Das ist für uns nicht wichtig. (Wenn es dich interessiert: siehe Datenblatt)

CKOPT:
Diese Einstellung wurde im vorherigen Beitrag erklärt. Damit kann man, je nach CKSEL-Einstellung einen oder zwei eingebaute Kondensatoren für den Oszillator aktivieren. Für Frequenzen ab 8 Mhz muss diese Einstellung gesetzt werden.

mfg
Gerold
Smile

_________________
http://halvar.at | http://sw3.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.


Zuletzt bearbeitet von gerold am Mo 17.März 2008 22:31:20, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Fuzzy



Anmeldungsdatum: 11.03.2008
Beiträge: 7

BeitragVerfasst am: Mo 17.März 2008 21:11:32    Titel: Bauteile finden Antworten mit Zitat

Hallo Gerold,

Hut ab!

Das ist ja genial was Du hier machst. Bin letzte Woche auf die Seite gestossen, weil ich gerade dabei bin auszuwerten welchen uC ich mir zulegen soll.

Ich will mir eine Wetterstation bauen hatte eine C-Control die ist aber anscheinend kaputt Crying or Very sad .

Aber das ist ein anderes Thema.

Die nächsten Tage werde ich mich mal hinsetzen und in einen passenden Thread schreiben um dort dann die Experten zu fragen was ich mir da evtl. für ein Experimentierboard zulegen soll.

Also weiter so, werde auch gespannt mit lesen Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
gerold



Anmeldungsdatum: 27.07.2007
Beiträge: 927
Wohnort: Oberhofen im Inntal (Tirol)

BeitragVerfasst am: Mo 17.März 2008 21:53:32    Titel: Bauteile finden Antworten mit Zitat

Fuzzy hat folgendes geschrieben:
Also weiter so, werde auch gespannt mit lesen Wink

Hallo Fuzzy!

Danke! Ich werde weiter machen. Smile

mfg
Gerold
Smile

_________________
http://halvar.at | http://sw3.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Anzeige






Verfasst am: Heute 06:17:56    Titel: Bauteile finden

Nach oben
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    loetstelle.net Foren-Übersicht -> Microcontroller und DSP Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite Zurück  1, 2, 3, 4 ... 18, 19, 20  Weiter
Seite 3 von 20

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum nicht herunterladen


Powered by phpBB 2.x © 2001, 2002 phpBB Group

Sie sind Besucher Nr. 1222755
©opyright by Markus Vohburger 2005 All Rights reserved