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 ... 5, 6, 7 ... 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
gerold



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

BeitragVerfasst am: Mi 26.März 2008 21:55:42    Titel: Bauteile finden Antworten mit Zitat

pcprofi hat folgendes geschrieben:
Wenn er jetzt dann auf nem Pin irgendwelche Ausgaben macht, ist das dem Programmer egal?

Hallo Rainer!

Ja, das ist dem egal. Er empfängt sowiso nur wenn er dazu vom PC aufgefordert wurde. Und wenn der Programmer Reset gegen GND zieht, ist sowiso aus mit den Signalen an den Pins. Dann hat der Programmer die Kontrolle.

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
Dany



Anmeldungsdatum: 27.03.2008
Beiträge: 2

BeitragVerfasst am: Do 27.März 2008 00:51:11    Titel: Bauteile finden Antworten mit Zitat

Hallo Gerold,

ich beschäftige mich seit 2 Wochen erstmals mit der Programmierung
eines Microcontrollers. Ich habe mich für einen AVR ATTiny2313
entschieden und die Programmierung mit Bascom Basic. Jetzt
bin ich über die Suchmaschine auf Deine Beiträge in diesem Forum
aufmerksam geworden und möchte hiermit meine Anerkennung für
Deine klar verständlichen Beiträge zum Ausdruck bringen. Diese
haben mich ein grosses Stück weiter gebracht.

Vielen Dank!
Gruss Dany
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
gerold



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

BeitragVerfasst am: Do 27.März 2008 08:48:55    Titel: Bauteile finden Antworten mit Zitat

Dany hat folgendes geschrieben:
klar verständlichen Beiträge

Hallo Dany!

Das geht runter wie Öl. 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
Dany



Anmeldungsdatum: 27.03.2008
Beiträge: 2

BeitragVerfasst am: Do 27.März 2008 11:18:39    Titel: Bauteile finden Antworten mit Zitat

Hallo Gerold,

ich möchte mich gerne Deinem Motto "Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt" anschliessen und hierzu meine ersten Erfahrungen zu Bascom Basic und über den ATTiny 2313 mitteilen. Syntax "$crystal" bezieht sich nicht auf die Oszillatorfrequenz (Quarz), sondern auf den Prozessortakt. Für
die Berechnung und Programmierung von Zeiten ist dies zu berücksichtigen, wenn man einen Vorteiler (Prescale) verwendet. Da ich meine Projekte für kleinste Stromaufnahme auslege, habe ich mich mit den diversen Sleep Modi des ATTiny2313 befasst und folgendes festgestellt: Der Befehl "POWERDOWN" in Bascom entspricht nicht dem gleichgenannten Befehl im Datenblatt von Atmel. Es hat mich Stunden gekostet, dies herauszufinden, gerade weil ich mir dazu mehrere Programmbeispiele und deren Dokumentation aus dem Internet angeschaut habe, die tatsächlich falsch interpretiert wurden. Der ATTiny2313 geht nur mit dem Befehl "POWERSAVE" in den tatsächlichen "POWERDOWN Mode", bei dem auch der interne- bzw. externe Taktoszillator abgeschaltet wird (Stromaufnahme ca. 500nA). Man sollte
auch unbedingt darauf achten, dass sämtliche nichtbenutzten Anschlüsse definiert werden, wenn diese "in der Luft hängen", sonst nützen die ganzen Stromspareinstellungen des Chips nichts. Ich habe hierzu sämtliche nicht verwendeten PINs auf Input programmiert und die internen Pull Up Widerstände aktiviert. Jetzt habe ich im POWERSAVE Modus den
Watchdog Timer aktiviert und werde bis zum Wochenende weitere Versuche machen.

Gruss Dany
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
gerold



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

BeitragVerfasst am: Do 27.März 2008 19:40:58    Titel: Ausgänge mit Computer steuern (z.B. LEDs, Relais,...) Bauteile finden Antworten mit Zitat

Hallo!

Beim letzten mal ging es um die UART und die Verbindung des µC über die RS-232-Schnittstelle mit dem Computer. Dieses Wissen kann man jetzt nutzen, um mit dem Computer die Ausgänge (Pins) des µC anzusteuern (z.B. um damit LEDs oder Relais zu schalten).

Damit das Beispiel nicht zu unübersichtlich wird, möchte ich nur fünf Pins ansteuern. Das sollte aber genügen. Dieses Beispiel lässt sich mit dem ATmega8 ganz einfach auf 17 oder, wenn man aufs Ganze geht, sogar auf 20 Ausgänge erweitern.

Der ATmega8 soll auf diese Befehle reagieren:
Code:
"SET 2 ON"       -->   Rückgabe: "OK"
"SET 3 OFF"      -->   Rückgabe: "OK"
"SET 3 ON"       -->   Rückgabe: "OK"
"SET ALL ON"     -->   Rückgabe: "OK"
"SET ALL OFF"    -->   Rückgabe: "OK"
"GET 5"          -->   Rückgabe: "0" oder "1"
"GET 4"          -->   Rückgabe: "0" oder "1"
"GET ALL"        -->   Rückgabe: z.B. "01001"
"ALL 01001"      -->   Rückgabe: "OK"
                                 "OK"
                                 "OK"
                                 "OK"
                                 "OK"

Weiters wäre es ideal wenn die Groß-/Kleinschreibung bei diesen Befehlen ignoriert werden würde.

Und hier das (etwas umfangreichere) Beispiel:
Code:
'========================================================================
' Ausgänge des ATmega8 über die UART (RS-232) schalten.
' (by Gerold http://halvar.at)
'
' Kommandos:
' - SET <Ausgangsnummer> ON|OFF
'     Einzelne Ausgänge schalten.
'     Beispiele: "SET 1 ON" oder "SET 2 OFF"
'     Rückgabe: "OK". Bei Fehler "ERROR" oder nichts.
' - SET ALL ON|OFF
'     So können in einem Rutsch alle Ausgänge ein- oder ausgeschaltet werden.
'     Beispiele: "SET ALL ON" oder "SET ALL OFF"
'     Rückgabe: "OK". Bei Fehler "ERROR" oder nichts.
' - GET <Ausgangnummer>
'     So wird der Status des angegebenen Ausganges zurück gegeben.
'     Rückgabe: "0" oder "1"
' - GET ALL
'     Gibt den Status aller Ausgänge zurück.
'     Z.B. so: "10010". Diese Ausgabe bedeutet, dass der erste Ausgang und der
'     vierte Ausgang ein und die anderen Ausgänge aus sind. Die Zählung beginnt
'     links (nicht wie bei Binärzahlen, von rechts).
' - ALL <Status für alle Ausgänge>
'     Damit werden in einem Rutsch alle Ausgänge geschaltet.
'     Beispiel: "ALL 10010". In diesem Beispiel wird in einem Rutsch der erste
'     und der vierte Augang eingeschaltet. Die Ausgänge 2, 3 und 5 werden
'     ausgeschaltet.
'     Rückgabe: "OK" für jeden Ausgang. Bei Fehler "ERROR" oder nichts.
'========================================================================
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 10
$framesize = 40
$baud = 38400

'Ausgänge
Output_1 Alias Portd.5
Output_2 Alias Portd.6
Output_3 Alias Portd.7
Output_4 Alias Portb.0
Output_5 Alias Portb.1

Config Output_1 = Output
Config Output_2 = Output
Config Output_3 = Output
Config Output_4 = Output
Config Output_5 = Output

'Globale Variablen
Dim Tmp As Byte
Dim New_command As String * 15
Dim Command_array(3) As String * 5
Dim New_status As Bit

'Prozeduren
Declare Sub Serial0charmatch()
Declare Sub Do_get_command(cmd_output As String)
Declare Sub Do_set_command(cmd_output As String , Cmd_status As String)
Declare Sub Do_all_command(cmd_status As String)

'UART-Buffer
Config Serialin = Buffered , Size = 15 , Bytematch = 13
Enable Interrupts


Do
   If New_command <> "" Then
      'Alles in Großbuchstaben umwandeln
      New_command = Ucase(new_command)

      'Anweisung aufteilen
      Tmp = Split(new_command , Command_array(1) , " ")

      Select Case Command_array(1)
      Case "GET"
         'Status des Ausganges/der Ausgänge zurück geben
         Call Do_get_command(command_array(2))
      Case "SET"
         'Stellt einen oder alle Ausgänge ein
         Call Do_set_command(command_array(2) , Command_array(3))
      Case "ALL"
         'Stellt alle Ausgänge ein
         Call Do_all_command(command_array(2))
      Case Else
         Print "ERROR: unknown command"
      End Select

      New_command = ""
   End If
Loop

End


'Wird automatisch ausgeführt, wenn CARRIAGE RETURN empfangen wird.
Sub Serial0charmatch()
   Input New_command Noecho
End Sub


'Gibt den Status des Ausganges/der Ausgänge zurück
Sub Do_get_command(cmd_output As String * 5)
   Select Case Cmd_output
   Case "ALL"
      Print Output_1 ; Output_2 ; Output_3 ; Output_4 ; Output_5
   Case "1"
      Print Output_1
   Case "2"
      Print Output_2
   Case "3"
      Print Output_3
   Case "4"
      Print Output_4
   Case "5"
      Print Output_5
   Case Else
      Print "ERROR: unknown output pin"
   End Select
End Sub


'Stellt einen oder alle Ausgänge ein
Sub Do_set_command(cmd_output As String * 5 , Cmd_status As String * 5)
   'Neuen Status herausfinden
   Select Case Cmd_status
   Case "ON"
      New_status = 1
   Case "OFF"
      New_status = 0
   Case Else
      Print "ERROR: unknown status"
      Exit Sub
   End Select

   'Ausgang/Ausgänge einstellen
   Select Case Cmd_output
   Case "ALL"
      Output_1 = New_status
      Output_2 = New_status
      Output_3 = New_status
      Output_4 = New_status
      Output_5 = New_status
   Case "1"
      Output_1 = New_status
   Case "2"
      Output_2 = New_status
   Case "3"
      Output_3 = New_status
   Case "4"
      Output_4 = New_status
   Case "5"
      Output_5 = New_status
   Case Else
      Print "ERROR: unknown output pin"
      Exit Sub
   End Select
   Print "OK"
End Sub


'Stellt alle Ausgänge ein
Sub Do_all_command(cmd_status As String * 5)
   Local Status_string As String * 1

   'Output_1
   Status_string = Mid(cmd_status , 1 , 1)
   Select Case Status_string
   Case "1"
      Output_1 = 1
      Print "OK"
   Case "0"
      Output_1 = 0
      Print "OK"
   Case Else
      Print "ERROR: unknown status"
   End Select

   'Output_2
   Status_string = Mid(cmd_status , 2 , 1)
   Select Case Status_string
   Case "1"
      Output_2 = 1
      Print "OK"
   Case "0"
      Output_2 = 0
      Print "OK"
   Case Else
      Print "ERROR: unknown status"
   End Select

   'Output_3
   Status_string = Mid(cmd_status , 3 , 1)
   Select Case Status_string
   Case "1"
      Output_3 = 1
      Print "OK"
   Case "0"
      Output_3 = 0
      Print "OK"
   Case Else
      Print "ERROR: unknown status"
   End Select

   'Output_4
   Status_string = Mid(cmd_status , 4 , 1)
   Select Case Status_string
   Case "1"
      Output_4 = 1
      Print "OK"
   Case "0"
      Output_4 = 0
      Print "OK"
   Case Else
      Print "ERROR: unknown status"
   End Select

   'Output_5
   Status_string = Mid(cmd_status , 5 , 1)
   Select Case Status_string
   Case "1"
      Output_5 = 1
      Print "OK"
   Case "0"
      Output_5 = 0
      Print "OK"
   Case Else
      Print "ERROR: unknown status"
   End Select
End Sub

Dann fange ich mal oben an. Ein wiederverwendbares Programm hat einen Kopf in dem erklärt wird was das Programm macht und was dazu notwendig ist beziehungsweise wie man es bedient. Viele schreiben in den Kopf auch, welche Pins wie angeschlossen werden. Das habe ich mir gespart, da ich die Pins im Programm mit aussagekräftigen Namen versehe.

Die Unterprozedur "Serial0charmatch" wird von Bascom automatisch ausgeführt, sobald über die UART das Zeichen mit der ASCII-Nummer 13 rein kommt. ASCII-13 ist CARRIAGE RETURN. Diese Einstellung wird mit dem Befehl CONFIG SERIALIN getroffen.

Die MainLoop habe ich klein gehalten, damit sie übersichtlich bleibt. Alle wichtigen Dinge werden in ausgelagerten Unterprozeduren erledigt.

Der Programmablauf beginnt, sobald über die UART ein CARRIAGE RETURN rein kommt. Bascom führt dann die Unterprozedur "Serial0charmatch" aus. In dieser Prozedur wird der Inhalt des UART-Buffers in die globale Variable "New_command" geschrieben.

In der MainLoop wird ständig geprüft ob etwas in dieser Variable steht. Sobald etwas drinnen steht, wird zuerst der Inhalt der Variable "New_command" mit dem Befehl UCASE in Großbuchstaben umgewandelt. Zahlen sind davon nicht betroffen.

Da ein Befehl aus zwei oder drei Teilen besteht, die mit einem Leerzeichen (" ") voneinander getrennt sind, splitte ich diese Teile auf, damit man besser damit arbeiten kann. Der Befehl SPLIT erledigt das für uns. SPLIT bekommt als erstes Argument den aufzusplittenden String übergeben. Als zweites Argument muss man ein ARRAY übergeben, welches mit den einzelnen Textabschnitten befüllt wird. Und als drittes Argument gibt man an, welche Zeichenfolge die einzelnen Textabschnitte voneinander trennt. Die Variable "Tmp" wird dabei mit der Anzahl der aufgesplitteten Textabschnitte befüllt (auch wenn wir diese Information nicht brauchen).

Mit SELECT CASE kann man den µC, je nach Wert einer Variable, etwas bestimmtes tun lassen. In diesem Fall wird geprüft ob im ersten Array-Element der Text "GET", "SET" oder "ALL" steht.

Wenn "GET" drinnen steht, dann wird die Unterprozedur "Do_get_command" ausgeführt. An diese Prozedur wird als Argument die abzufragende Pinnummer (als Text) oder "ALL" übergeben. Diese Information steht im zweiten Array-Element. In der Prozedur "Do_get_command" wird mit SELECT CASE geprüft, ob ALL oder eine Pinnummer übergeben wurde. Wurde "ALL" übergeben, dann wird der Status aller Ausgänge mit PRINT über die UART an den Computer zurück geschickt. Wurde eine Pinnummer übergeben, dann wird der Status dieses einen Pins zurück geschickt. Wurde irgendetwas anderes übergeben, dann wird eine Fehlermeldung zurück geschickt.

Wenn "SET" im ersten Array-Element steht, dann wird die Unterprozedur "Do_set_command" ausgeführt. An diese Prozedur wird als erstes Argument die Pinnummer des zu setzenden Pins oder "ALL" übergeben. Als zweites Argument wird der gewünschte Status ("ON" oder "OFF") übergeben. In der Prozedur "Do_set_command" wird zuerst geprüft ob "ON" oder "OFF" übergeben wurde. Bei "ON" wird die globale BIT-Variable "New_status" auf 1 gesetzt. Bei "OFF" wird diese Variable auf 0 gesetzt. Ich hätte ja gerne eine lokale Variable dafür verwendet, aber das ist eine Einschränkung von Bascom. Man kann keine BIT-Variablen lokal definieren. In diesem Fall ist das kein Problem, da das Programm noch recht übersichtlich ist und keine Gefahr besteht, dass der Wert der Variable "New_status" von Außen geändert werden kann. Diese Gefahr könnte bestehen, wenn man diese Variable auch in einem Interrupt-Handler verwende würde, aber das tun wir ja nicht. Nachdem der neue Status ermittelt wurde, wird wieder mit SELECT CASE entschieden, welcher Ausgang neu gesetzt wird.

Wenn "ALL" im ersten Array-Element steht, dann wird die Unterprozedur "Do_all_command" ausgeführt. An diese Prozedur wird nur der neue, gewünschte Status übergeben. Das genügt, da wir ja wissen, dass alle Ausgänge neu gesetzt werden sollen.

In der Prozedur wiederholt sich folgendes Szenario für jeden Pin:
- Mit dem Befehl MID wird aus dem übergebenen Text (z.B. "10010") das erste, zweite, dritte, vierte oder fünfte Zeichen herausgeholt und in die lokale Variable "Status_string" geschrieben.
- Je nach Wert des "Status_string" ("0" oder "1") wird der Ausgang auf LOW oder HIGH gesetzt.
- Mit ``PRINT "OK"`` wird der Text "OK" über die UART an den Computer zurück gegeben.
- Trat ein Fehler auf, dann wird eine Fehlermeldung zurück gegeben.

Nach dem Ausführen der entsprechenden Unterprozedur wird die Variable "New_command" wieder zurück gesetzt, damit nicht bei jedem Schleifendurchlauf die Ausgänge neu gesetzt werden.

Wurde in der MainLoop weder "GET", "SET" oder "ALL" erkannt, dann wird eine Fehlermeldung über die UART an den Computer zurück geschickt.

Dieses Programm kann man testen, indem man die Befehle direkt über ein Terminalprogramm an den µC schickt.

Viel Spaß beim Ausprobieren!

Hast du Fragen?

mfg
Gerold
Smile

PS: Man kann dieses Programm verkürzen. Aber ich habe absichtlich darauf verzichtet, da es sich ja um ein Beispiel für Anfänger handelt. Dieses Beispiel wird im nächsten Beitrag um FOR-NEXT-Schleifen und ein paar zusätzliche Ausgänge erweitert. Dann hat man einen direkten Vergleich zwischen den einzelnen Techniken.

_________________
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 28.März 2008 14:33:37    Titel: Fusebits Standardeinstellungen Bauteile finden Antworten mit Zitat

Hallo!

Ich muss noch einen Beitrag dazwischen quetschen. Es geht um die Frage, wie die Fusebits in den meisten Fällen eingestellt werden müssen.

Und hier ist sie, die Auflistung der meist eingesetzten Standardeinstellungen der Fusebits für den ATmega8.


mySmartUSB mit "myAVR Workpad Plus"

1 Mhz interner RC-Oscillator

Low Fuse
- ``11100001``
- Brown-out detection level at VCC=2.7 V; [BODLEVEL=1]
- Int. RC Osc. 1 MHz; Start-up time: 6 CK + 64 ms; [CHSEL=0001 SUT=10]; default value

High Fuse
- ``11011001``
- Serial program downloading (SPI) enabled; [SPIEN=0]
- Boot Flash section size=1024 words Boot start address=$0C00; [BOOTSZ=00]; default value

Lockbits
- ``11111111``
- Mode 1: No memory lock features enabled
- Application Protection Mode 1: No Lock on SPM and LPM in Application Section
- Boot Loader Protection Mode 1: No lock on SPM and LPM in Boot Loader Section


8 Mhz interner RC-Oscillator

Low Fuse
- ``11100100``
- Brown-out detection level at VCC=2.7 V; [BODLEVEL=1]
- Int. RC Osc. 8 MHz; Start-up time: 6 CK + 64 ms; [CKSEL=0100 SUT=10]

High Fuse
- ``11011001``
- Serial program downloading (SPI) enabled; [SPIEN=0]
- Boot Flash section size=1024 words Boot start address=$0C00; [BOOTSZ=00]; default value

Lockbits
- ``11111111``
- Mode 1: No memory lock features enabled
- Application Protection Mode 1: No Lock on SPM and LPM in Application Section
- Boot Loader Protection Mode 1: No lock on SPM and LPM in Boot Loader Section


3-8 Mhz externer Quarz

Low Fuse
- ``11111111``
- Brown-out detection level at VCC=2.7 V; [BODLEVEL=1]
- Ext. Crystal/Resonator High Freq.; Start-up time: 16K CK + 64 ms; [CKSEL=1111 SUT=11]

High Fuse
- ``11011001``
- Serial program downloading (SPI) enabled; [SPIEN=0]
- Boot Flash section size=1024 words Boot start address=$0C00; [BOOTSZ=00]; default value

Lockbits
- ``11111111``
- Mode 1: No memory lock features enabled
- Application Protection Mode 1: No Lock on SPM and LPM in Application Section
- Boot Loader Protection Mode 1: No lock on SPM and LPM in Boot Loader Section


8-16 Mhz externer Quarz

Low Fuse
- ``11111111``
- Brown-out detection level at VCC=2.7 V; [BODLEVEL=1]
- Ext. Crystal/Resonator High Freq.; Start-up time: 16K CK + 64 ms; [CKSEL=1111 SUT=11]

High Fuse
- ``11001001``
- Serial program downloading (SPI) enabled; [SPIEN=0]
- Boot Flash section size=1024 words Boot start address=$0C00; [BOOTSZ=00]; default value
- CKOPT fuse (operation dependent of CKSEL fuses); [CKOPT=0]

Lockbits
- ``11111111``
- Mode 1: No memory lock features enabled
- Application Protection Mode 1: No Lock on SPM and LPM in Application Section
- Boot Loader Protection Mode 1: No lock on SPM and LPM in Boot Loader Section


PonyProg

1 Mhz interner RC-Oscillator

Lockbits
- ``11111111``

High Fuse
- ``11011001``
- SPIEN
- BOOTSZ1
- BOOTSZ0

Low Fuse
- ``11100001``
- SUT0
- CKSEL3
- CKSEL2
- CHSEL1




8 Mhz interner RC-Oscillator

Lockbits
- ``11111111``

High Fuse
- ``11011001``
- SPIEN
- BOOTSZ1
- BOOTSZ0

Low Fuse
- ``11100100``
- SUT0
- CKSEL3
- CKSEL1
- CHSEL0




3-8 Mhz externer Quarz

Lockbits
- ``11111111``

High Fuse
- ``11011001``
- SPIEN
- BOOTSZ1
- BOOTSZ0

Low Fuse
- ``11111111``




8-16 Mhz externer Quarz

Lockbits
- ``11111111``

High Fuse
- ``11001001``
- SPIEN
- CKOPT
- BOOTSZ1
- BOOTSZ0

Low Fuse
- ``11111111``




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: Mo 31.März 2008 21:10:30    Titel: 20 Ausgänge mit dem Computer steuern Bauteile finden Antworten mit Zitat

Hallo!

Wie versprochen, habe ich das letzte Programm ein wenig umgestaltet. Es kommen ein paar neue Befehle und Techniken darin vor, die ich im Anschluss erkläre. Außerdem habe ich das Programm aufgebohrt. Es können damit 20 Ausgänge des ATmega8 vom Computer aus ferngesteuert werden um damit LEDs, Relais oder andere Dinge zu schalten. Smile

Code:
'========================================================================
' 20 Ausgänge des ATmega8 über die UART (RS-232) schalten.
' (by Gerold http://halvar.at)
'
' Es wird der eingebaute RC-Oscillator mit 8 Mhz verwendet. So können PB6 und
' PB7 auch als Ausgänge verwendet werden.
'
' Kommandos:
' - SET <Ausgangsnummer> ON|OFF
'     Einzelne Ausgänge schalten.
'     Beispiele: "SET 1 ON" oder "SET 2 OFF"
'     Rückgabe: "OK". Bei Fehler "ERROR" oder nichts.
' - SET ALL ON|OFF
'     So können in einem Rutsch alle Ausgänge ein- oder ausgeschaltet werden.
'     Beispiele: "SET ALL ON" oder "SET ALL OFF"
'     Rückgabe: "OK". Bei Fehler "ERROR" oder nichts.
' - GET <Ausgangnummer>
'     So wird der Status des angegebenen Ausganges zurück gegeben.
'     Rückgabe: "0" oder "1"
' - GET ALL
'     Gibt den Status aller Ausgänge zurück.
'     Z.B. so: "10010000000000000000".
'     Diese Ausgabe bedeutet, dass der erste Ausgang und der
'     vierte Ausgang ein und die anderen Ausgänge aus sind. Die Zählung beginnt
'     links (nicht wie bei Binärzahlen, von rechts).
' - ALL <Status für alle Ausgänge>
'     Damit werden in einem Rutsch alle Ausgänge geschaltet.
'     Beispiel: "ALL 10010000000000000000".
'     In diesem Beispiel wird in einem Rutsch der erste
'     und der vierte Augang eingeschaltet. Die restlichen Ausgänge werden
'     ausgeschaltet.
'     Rückgabe: "OK" für jeden Ausgang. Bei Fehler "ERROR" oder nichts.
' - ALL ON | OFF
'     So können, wie bereits mit ``SET ALL ON | OFF``, in einem Rutsch alle
'     Ausgänge ein- oder ausgeschaltet werden.
'     Beispiele: "ALL ON" oder "ALL OFF"
'     Rückgabe: "OK" für jeden Ausgang. Bei Fehler "ERROR" oder nichts.
'========================================================================
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 30
$framesize = 60
$baud = 38400

'Ausgänge nach Pin-Reihenfolge (1-28)
Output_1 Alias Portd.2
Output_2 Alias Portd.3
Output_3 Alias Portd.4
Output_4 Alias Portb.6
Output_5 Alias Portb.7
Output_6 Alias Portd.5
Output_7 Alias Portd.6
Output_8 Alias Portd.7
Output_9 Alias Portb.0
Output_10 Alias Portb.1
Output_11 Alias Portb.2
Output_12 Alias Portb.3       'MOSI
Output_13 Alias Portb.4       'MISO
Output_14 Alias Portb.5       'SCK
Output_15 Alias Portc.0
Output_16 Alias Portc.1
Output_17 Alias Portc.2
Output_18 Alias Portc.3
Output_19 Alias Portc.4
Output_20 Alias Portc.5

Config Output_1 = Output
Config Output_2 = Output
Config Output_3 = Output
Config Output_4 = Output
Config Output_5 = Output
Config Output_6 = Output
Config Output_7 = Output
Config Output_8 = Output
Config Output_9 = Output
Config Output_10 = Output
Config Output_11 = Output
Config Output_12 = Output
Config Output_13 = Output
Config Output_14 = Output
Config Output_15 = Output
Config Output_16 = Output
Config Output_17 = Output
Config Output_18 = Output
Config Output_19 = Output
Config Output_20 = Output

'Globale Variablen
Dim Tmp As Byte
Dim New_command As String * 30
Dim Command_array(3) As String * 20

'Prozeduren
Declare Sub Serial0charmatch()
Declare Sub Set_output(byval Outputnr As Byte , Byval Value As Byte)
Declare Sub Do_get_command(byval Cmd_output As String)
Declare Sub Do_set_command(byval Cmd_output As String , Byval Cmd_status As String)
Declare Sub Do_all_command(byval Cmd_status As String)

'UART-Buffer
Config Serialin = Buffered , Size = 30 , Bytematch = 13

'Interrupts einschalten
Enable Interrupts


Do
   If New_command <> "" Then
      'Alles in Großbuchstaben umwandeln
      New_command = Ucase(new_command)

      'Anweisung aufteilen
      Tmp = Split(new_command , Command_array(1) , " ")

      Select Case Command_array(1)
      Case "GET"
         'Status des Ausganges/der Ausgänge zurück geben
         Call Do_get_command(command_array(2))
      Case "SET"
         'Stellt einen oder alle Ausgänge ein
         Call Do_set_command(command_array(2) , Command_array(3))
      Case "ALL"
         'Stellt alle Ausgänge ein
         Call Do_all_command(command_array(2))
      Case Else
         Print "ERROR: unknown command"
      End Select

      'Zurück setzen
      New_command = ""
      Command_array(1) = ""
      Command_array(2) = ""
      Command_array(3) = ""
   End If
Loop

End


'Wird automatisch ausgeführt, wenn CARRIAGE RETURN empfangen wird.
Sub Serial0charmatch()
   Input New_command Noecho
End Sub


Sub Set_output(byval Outputnr As Byte , Byval Value As Byte)
   Select Case Outputnr
   Case 1 : Output_1 = Value
   Case 2 : Output_2 = Value
   Case 3 : Output_3 = Value
   Case 4 : Output_4 = Value
   Case 5 : Output_5 = Value
   Case 6 : Output_6 = Value
   Case 7 : Output_7 = Value
   Case 8 : Output_8 = Value
   Case 9 : Output_9 = Value
   Case 10 : Output_10 = Value
   Case 11 : Output_11 = Value
   Case 12 : Output_12 = Value
   Case 13 : Output_13 = Value
   Case 14 : Output_14 = Value
   Case 15 : Output_15 = Value
   Case 16 : Output_16 = Value
   Case 17 : Output_17 = Value
   Case 18 : Output_18 = Value
   Case 19 : Output_19 = Value
   Case 20 : Output_20 = Value
   Case Else
      Print "ERROR: unknown output pin"
   End Select
End Sub


'Gibt den Status des Ausganges/der Ausgänge zurück
Sub Do_get_command(cmd_output As String * 3)
   Select Case Cmd_output
   Case "ALL"
      Print Output_1 ; Output_2 ; Output_3 ; Output_4 ; Output_5 ; Output_6 ; _
         Output_7 ; Output_8 ; Output_9 ; Output_10 ; Output_11 ; Output_12 ; _
         Output_13 ; Output_14 ; Output_15 ; Output_16 ; Output_17 ; Output_18 ; _
         Output_19 ; Output_20
   Case "1" : Print Output_1
   Case "2" : Print Output_2
   Case "3" : Print Output_3
   Case "4" : Print Output_4
   Case "5" : Print Output_5
   Case "6" : Print Output_6
   Case "7" : Print Output_7
   Case "8" : Print Output_8
   Case "9" : Print Output_9
   Case "10" : Print Output_10
   Case "11" : Print Output_11
   Case "12" : Print Output_12
   Case "13" : Print Output_13
   Case "14" : Print Output_14
   Case "15" : Print Output_15
   Case "16" : Print Output_16
   Case "17" : Print Output_17
   Case "18" : Print Output_18
   Case "19" : Print Output_19
   Case "20" : Print Output_20
   Case Else
      Print "ERROR: unknown output pin"
   End Select
End Sub


'Stellt einen oder alle Ausgänge ein
Sub Do_set_command(cmd_output As String * 3 , Cmd_status As String * 3)
   Local Outputnr As Byte
   Local Value As Byte

   'Neuen Status herausfinden
   Select Case Cmd_status
   Case "ON"
      Value = 1
   Case "OFF"
      Value = 0
   Case Else
      Print "ERROR: unknown status"
      Exit Sub
   End Select

   'Ausgang/Ausgänge einstellen
   Select Case Cmd_output
   Case "ALL"
      For Outputnr = 1 To 20
         Call Set_output(outputnr , Value)
      Next Outputnr
   Case Else
      Outputnr = Val(cmd_output)
      If Outputnr > 0 Then       ' Wenn kein Fehler beim Umwandeln passiert ist
         Call Set_output(outputnr , Value)
      Else
         Print "ERROR: unknown output pin"
         Exit Sub
      End If
   End Select
   Print "OK"
End Sub


'Stellt alle Ausgänge ein
Sub Do_all_command(cmd_status As String * 20)
   Local Status_string As String * 1
   Local Outputnr As Byte

   Select Case Cmd_status
   Case "ON"
      For Outputnr = 1 To 20
         Call Set_output(outputnr , 1)
         Print "OK"
      Next Outputnr
   Case "OFF"
      For Outputnr = 1 To 20
         Call Set_output(outputnr , 0)
         Print "OK"
      Next Outputnr
   Case Else
      If Len(cmd_status) = 20 Then
         For Outputnr = 1 To 20
            Status_string = Mid(cmd_status , Outputnr , 1)
            Select Case Status_string
            Case "1"
               Call Set_output(outputnr , 1)
               Print "OK"
            Case "0"
               Call Set_output(outputnr , 0)
               Print "OK"
            Case Else
               Print "ERROR: unknown status"
            End Select
         Next Outputnr
      Else
         Print "ERROR: unknown status"
      End If
   End Select
End Sub

Den HWStack, den SWStack und den Frame habe ich nach Gefühl vergrößert, da das Programm komplexer geworden ist.

Die Variable "New_command" ist jetzt größer geworden, da jetzt der Status beim Befehl ``ALL`` 20 Zeichen lang ist. "Command_array" wurde deshalb ebenfalls vergrößert. Auch CONFIG SERIALIN wurde entsprechend angepasst.

Wenn man sich die Deklarationen der Unterprozeduren ansieht, dann fallen zwei Dinge auf. Ich verwende "byval" und bei "As String" fehlt die Angabe der Textlänge.

Das ist jetzt ein bischen kompliziert. Neutral Der Zusatz "byval" kennzeichnet einen Parameter als "Wertparameter". Das heißt, dass beim Aufruf der Unterprozedur der Wert einer Variable in eine neue Variable (in einen neuen Speicherbereich) kopiert wird. Gibt man "byval" nicht an, dann wird standardmäßig "byref" verwendet. Mit "byref" wird der Wert nicht in einen neuen Speicherbereich kopiert, sondern nur eine Referenz zum Speicherbereich übergeben in dem der Wert liegt. "byval" kapselt die Unterprozedur besser vom Rest des Programmes ab und hilft damit Fehler zu vermeiden. "byref" (der Standard) kapselt den Parameter nicht vom Rest des Programmes ab. Änderungen dieses Parameters (dieser Variable) wirken sich auch außerhalb der Unterprozedur aus. Umgekehrt ist es natürlich genau so. Ein mit "byref" deklarierter Parameter kann sich (z.B. durch einen Interrupt) ändern, wärend die Unterprozedur abgearbeitet wird. Das kann wiederum unerklärliche Fehler hervorrufen. Dafür ist "byref" schneller als "byval", da die Arbeit des Kopierens wegfällt.

So lange du nicht optimieren musst, nimm "byval"!

Und was den zweiten Puntk betrifft, kann ich dir keine Erklärung dazu bieten. Man kann die Textlänge beim Deklarieren nicht einstellen. Macht man es, dann bekommt man einen Fehler beim Kompilieren des Programms. Mehr weiß ich auch nicht darüber.

Hilfe findest du unter:
- http://avrhelp.mcselec.com/index.html?declare_sub.htm
- http://avrhelp.mcselec.com/index.html?sub.htm
- http://avrhelp.mcselec.com/index.html?call.htm

Es ist eine neue Unterprozedur dazu gekommen. "Set_output" erleichtert das Arbeiten mit den vielen Ausgängen. Besonders für die neu eingeführte FOR-NEXT-Schleife.

FOR-NEXT-Schleife
Die FOR-NEXT-Schleife (auch FOR-Schleife genannt) ist ein Befehlskonstrukt, mit dem man Programmcode mehrmals hintereinander ausführen kann, ohne diesen Programmcode mehrmals schreiben zu müssen. Der große Vorteil der FOR-NEXT-Schleife ist, dass man in einer Variable einen Zähler bei jedem Schleifendurchlauf erhöhen kann. Dieser Zähler (eine Zahl) kann in der Schleife verwendet werden.

So eine FOR-NEXT-Schleife sieht ungefähr so aus:
Code:
FOR <variablename> = <beginn> TO <ende>
   <Programmcode, der mehrmals ausgeführt wird>
NEXT <variablename>

Beispiel:
Code:
DIM My_bytevar AS BYTE
FOR My_bytevar = 1 TO 10
   PRINT "Wert der Variable 'My_bytevar': " ; My_bytevar
NEXT My_bytevar

Diese FOR-Schleife wird zehn mal ausgeführt. Beim Ersten Durchlauf hat die Variable "My_bytevar" den Wert 1. Beim zweiten Durchlauf hat sie den Wert 2. Usw.

Die Bascom-Hilfe zu diesem Befehl: http://avrhelp.mcselec.com/index.html?for_next.htm


Code:
      'Zurück setzen
      New_command = ""
      Command_array(1) = ""
      Command_array(2) = ""
      Command_array(3) = ""

In der Hauptschleife hat sich kaum etwas geändert. Dort setze ich nur zusätzlich auch den Inhalt der Arrayelemente zurück. Damit versuche ich unvorhersehbare Nebeneffekte zu vermeiden.


Code:
Sub Set_output(byval Outputnr As Byte , Byval Value As Byte)
   Select Case Outputnr
   Case 1 : Output_1 = Value
   Case 2 : Output_2 = Value
   ...
   Case 19 : Output_19 = Value
   Case 20 : Output_20 = Value
   Case Else
      Print "ERROR: unknown output pin"
   End Select
End Sub

Da man für den Zugriff auf einen der Ausgänge den Namen des Ausganges (Output_1 bis Output_20) kennen muss hilft die neue Unterprozedur "Set_output" dabei, den Ausgang zu setzen wenn man nur die Ausgangsnummer aber nicht den Namen weiß. In einer FOR-Schleife hat man eine Zahl zur Verfügung die sich bei jedem Schleifendurchlauf hoch zählt. Um nicht in jeder FOR-Schleife mit SELECT CASE den gewünschten Ausgang bestimmen zu müssen, wurde dieser Code in diese neue Unterprozedur ausgelagert. An diese Unterprozedur wird die Nummer des Ausganges übergeben. Anhand dieser Nummer wird der gewünschte Ausgang mit SELECT CASE bestimmt und der neue Statuswert (0 oder 1) zugewiesen. Da man als Parameter einer Unterprozedur keine BIT-Variable verwenden kann, wurde dort eine BYTE-Variable verwendet. Das ist aber kein Problem, da beim Zuweisen eines Wertes an "Output_1" bis "Output_20" automatisch nur das erste Bit (von rechts gezählt) der Byte-Variable übergeben wird. Statt ``&B00000001`` wird nur das erste Bit (rechts außen) ``&B1`` zugewiesen. Das ist sehr praktisch und erstpart uns das Auslesen dieses Bits. Das ist natürlich Speicherverschwendung -- aber wer hat, der kann. Smile

Code:
Sub Do_get_command(cmd_output As String * 3)
   Select Case Cmd_output
   Case "ALL"
      Print Output_1 ; ... Output_20
   Case "1" : Print Output_1
   ...
   Case "20" : Print Output_20
   Case Else
      Print "ERROR: unknown output pin"
   End Select
End Sub

Die Unterprozedur "Do_get_command" wurde nur um die zusätzlichen Ausgänge erweitert.

Code:
Sub Do_set_command(cmd_output As String * 3 , Cmd_status As String * 3)
   Local Outputnr As Byte
   Local Value As Byte

   'Neuen Status herausfinden
   Select Case Cmd_status
   Case "ON"
      Value = 1
   Case "OFF"
      Value = 0
   Case Else
      Print "ERROR: unknown status"
      Exit Sub
   End Select

   'Ausgang/Ausgänge einstellen
   Select Case Cmd_output
   Case "ALL"
      For Outputnr = 1 To 20
         Call Set_output(outputnr , Value)
      Next Outputnr
   Case Else
      Outputnr = Val(cmd_output)
      If Outputnr > 0 Then       ' Wenn kein Fehler beim Umwandeln passiert ist
         Call Set_output(outputnr , Value)
      Else
         Print "ERROR: unknown output pin"
         Exit Sub
      End If
   End Select
   Print "OK"
End Sub

Die Unterprozedur "Do_set_command" wurde ein wenig umgebaut. Die lokale Variable "Outputnr" wird für die FOR-Schleife zum Hochzählen benutzt. Die lokale BYTE-Variable "Value" ersetzt die im alten Programm verwendete BIT-Variable "New_status". Wird an den Parameter "Cmd_output" der Wert "ALL" übergeben, dann wird in einer FOR-Schleife jeder der zwanzig Ausgänge durchlaufen und ein- oder ausgeschaltet.
Steht in der Variable "Cmd_output" nicht "ALL", dann wird erwartet, dass eine Zahl übergeben wurde. Also wird zuerst versucht, "cmd_output" mit dem Befehl VAL in eine Zahl umzuwandeln. Wurde keine Zahl erkannt, dann wird damit in die Variable "Outputnr" die Zahl 0 geschrieben. Wird eine Zahl erkannt, dann wird diese in "Outputnr" geschrieben. Der Rest der Unterprozedur sollte sich selbst erklären.

Code:
Sub Do_all_command(cmd_status As String * 20)
   Local Status_string As String * 1
   Local Outputnr As Byte

   Select Case Cmd_status
   Case "ON"
      For Outputnr = 1 To 20
         Call Set_output(outputnr , 1)
         Print "OK"
      Next Outputnr
   Case "OFF"
      For Outputnr = 1 To 20
         Call Set_output(outputnr , 0)
         Print "OK"
      Next Outputnr
   Case Else
      If Len(cmd_status) = 20 Then
         For Outputnr = 1 To 20
            Status_string = Mid(cmd_status , Outputnr , 1)
            Select Case Status_string
            Case "1"
               Call Set_output(outputnr , 1)
               Print "OK"
            Case "0"
               Call Set_output(outputnr , 0)
               Print "OK"
            Case Else
               Print "ERROR: unknown status"
            End Select
         Next Outputnr
      Else
         Print "ERROR: unknown status"
      End If
   End Select
End Sub

Die Unterprozedur "Do_all_command" hat sich mit der Einführung der FOR-Schleife am radikalsten verkürzt. Sie war im ursprünglichen Programm ja schon groß, aber bei 20 Ausgängen wäre sie ohne die FOR-Schleife riesig geworden.
Wird "ON" oder "OFF" erkannt, dann wird in jeweils einer FOR-Schleife jeder Ausgang durchlaufen und ein- oder ausgeschaltet. Ansonsten wird geprüft ob der Statustext 20 Zeichen lang ist. Und wenn das der Fall ist, dann wird in einer FOR-Schleife jedes Zeichen des Statustextes (cmd_status) durchlaufen. Und wieder wird mit einem Aufruf der Unterprozedur "Set_output" jeder der Ausgänge ein- oder ausgeschaltet.


Das ist, im Gegensatz zu den anfänglichen kleinen Progrämmchen, schon richtig harter Stoff. Besonders für Nichtprogrammierer. Teilt mir deshalb mit, ob es damit Probleme gab oder gibt oder ob alles nachvollzogen werden kann. Jede Rückmeldung ist für mich wichtig. Dann kann ich die Themen der nächsten Beiträge besser abstimmen und auf Probleme eingehen.


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 31.März 2008 21:56:24, insgesamt 6-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
BellaD



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

BeitragVerfasst am: Mo 31.März 2008 21:22:23    Titel: Bauteile finden Antworten mit Zitat

Harter Stoff Wink

das erzeugt einen overhead der sich sehen lassen kann Shocked
aber jetzt hat mein atmega endlich mal richtig was zu tun -rauf aufn stack runter vom stack und das bei fast jedem variablen aufruf - I like it

_________________
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: Mo 31.März 2008 22:18:52    Titel: Bauteile finden Antworten mit Zitat

BellaD hat folgendes geschrieben:
Harter Stoff Wink
das erzeugt einen overhead der sich sehen lassen kann Shocked
aber jetzt hat mein atmega endlich mal richtig was zu tun -rauf aufn stack runter vom stack und das bei fast jedem variablen aufruf - I like it

Hallo BellaD!

Nicht dass jetzt ein falscher Eindruck entsteht. Wink Bei diesem Programm gähnt der ATmega8 immer noch vor sich hin und wartet auf richtige Arbeit. Mr. Green

Falls der Computer ohne Unterbrechung Daten an den ATmega8 schickt, kommt alle 2083 Ticks ein neues Byte über die UART rein. Das heißt, dass der ATmega8 über 2000 Arbeitsschritte erledigen kann, während nur ein einzelnes Byte übertragen wird. Very Happy

Würde man auf einen 16 Mhz-Quarz umsteigen, dann würde man zwar zwei Ausgänge einbüßen, aber 4000 Arbeitsschritte erledigen können, während ein Byte rein kommt. Damit hat man noch genug Power auf Reserve.

lg
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: Di 01.Apr 2008 08:27:37    Titel: Bauteile finden Antworten mit Zitat

Hallo!

Embarassed Ich glaube, dass ich mit den letzten beiden Programmbeispielen ein wenig zu weit gegangen bin. Die Beispiele sind vielleicht etwas zu groß geworden um sie als Anfänger nachvollziehen zu können.

Ich werde versuchen, solch große Beispiele vom Kurs fern zu halten.

Schreibt mir eure Meinung dazu.

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
BellaD



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

BeitragVerfasst am: Di 01.Apr 2008 10:07:01    Titel: Bauteile finden Antworten mit Zitat

Moin

Daran hab ich auch schon gedacht Wink das erweitern kann ja jeder selber wenn er denn die Grundlagen verstanden hat .

Zum Overhead - ich meine damit den Overhead den der Compiler erzeugt und was dann der MC damit machen muss .Darum funktioniert das mit den Hochsprachen ja auch nur mit den Chips die Ram haben.
Kannste dir schön im AVR Studio ansehen - das Obj.File vom Compiler ( musst du unter compiler optionen einstellen ,das er das miterzeugt) in AVR-Studio laden.Neues Projekt erstellen. Und dann kannst du das debuggen, und im Disasssembler Fenster zuschauen.
Cool

_________________
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
pcprofi



Anmeldungsdatum: 17.02.2008
Beiträge: 1459
Wohnort: Düren

BeitragVerfasst am: Di 01.Apr 2008 16:24:42    Titel: Bauteile finden Antworten mit Zitat

Ich denke auch, dass du deine Beiträge auf einfache Grundfunktionen erstmal einschränken musst...

Ich versuche im Moment mitzulesen, und ich muss zugeben, sich durch einen so lange Programmtext zu quälen macht zum lernen nciht viel Spass - weil man einfach immer wieder rauf und runter muss um das ganze zu verstehen...

Ich denke, wenn man nämlich die Grundzüge verstanden hat, dann kommt man auch selber weiter...

Trotzdem danke für den tollen Kurs Smile

Gruß Rainer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Bauteiltöter



Anmeldungsdatum: 10.03.2008
Beiträge: 172

BeitragVerfasst am: Di 01.Apr 2008 17:07:38    Titel: Bauteile finden Antworten mit Zitat

hi,
ich lese diese Thema auch mit, und würde mich freuen, wen du irgendwan das abfragen von 3x4-Matrixtastaturen erklären könntest.

Mach weiter so!

mfg Bauteiltöter
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Fuzzy



Anmeldungsdatum: 11.03.2008
Beiträge: 7

BeitragVerfasst am: Di 01.Apr 2008 17:41:56    Titel: Bauteile finden Antworten mit Zitat

mich würde interessieren wie ich eine Spannung, z.B. Widerstandsänderung bei einem Temperaturfühler, am LED Display in C° anzeigen kann,

Gruß
Roger
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
gerold



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

BeitragVerfasst am: Di 01.Apr 2008 19:19:04    Titel: Bauteile finden Antworten mit Zitat

Bauteiltöter hat folgendes geschrieben:
abfragen von 3x4-Matrixtastaturen

Hallo Bauteiltöter!

Ich werde gleich im nächsten Beitrag darauf eingehen.


Fuzzy hat folgendes geschrieben:
Spannung, z.B. Widerstandsänderung bei einem Temperaturfühler, am LED Display in C° anzeigen

Hallo Roger!

Ich werde zuerst auf die Ausgabe der Daten auf ein LCD eingehen. Und dann werde ich den Analog/Digital-Converter vorstellen.


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 15:36:39    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 ... 5, 6, 7 ... 18, 19, 20  Weiter
Seite 6 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. 1222196
©opyright by Markus Vohburger 2005 All Rights reserved