Bascom erlernen

bascomlaie

Neues Mitglied
16. Feb. 2014
8
0
0
77
Sprachen
Hallo,
ich habe bis jetzt nichts mit Programmierung zu tun gehabt und möchte mir ein paar Grundkenntnisse aneignen. Ich
habe mir bascom AVR 2077 angeschafft und ein kleines Programm (Blinklicht nach Vorlage Youtube) geschrieben.
Programmer ist myUSBlight und myBoard light. Jetzt komme ich aber nicht weiter um die Funktion zu testen. vielleicht habe ich in den Einstellungen einen Fehler. Vielleicht kann mir jemand einen Tipp geben.
MfG Rudi
 
Hollo Rudi
Ich hoffe, du liest hier noch. Da dir bisher niemand geantwortet hat, will ich mal versuchen, dir ein paar Tips zu geben. Gut, ich hab mit BASCOM nix am Hut, allerdings arbeiten Programme alle gleich : Sie setzen deine Befehle so um, das ein Prozessor damit irgend was anstellen kann. Das ist zwar nicht immer das was du willst, aber irgendwann weiß man dann, wie so ein Prozessor "denkt" und was er braucht um die eigenen Gedanken zu verstehen. Dann ist man Programmierer oder zumindest auf dem besten Weg dorthin.
Wenn du nun mit einem Beispiel abgefangen hast und die Programmierung läuft, verändere erst einmal ein paar Werte. z.B. Blinkdauer. Dann läßt du es nur Blinken, wenn du eine Freigabe setzt. So lernst du Schritt für Schritt Funktionen zu kombinieren und auch verstehen. Dann beginnst du dir, eine Aufgabe zu stellen. Eine Ampel beispielsweise. Erst einfach, dann eine Kreuzung, dann mit Fußgängern und Abzweigspuren. Glaub mir, das klingt banal, ist es für einen Programmierer auch, aber für einen Anfänger schon ein richtiges Paket. Denn du musst analysieren, wie solche Ampelschaltungen aufgebaut sind. Bis du erkennst, welche Werkzeuge (Programmbefehle) zu verwenden sind, das wird etwas dauern. Eine Hilfe gebe ich dir mal mit.
Eine einfache Ampel hat 4 Schritte: 1.Grün, 2.gelb, 3.rot, 4.rotgelb, 1.grün usw.
mit Fussgänger sind es schon 6: 1. Auto grün, 2. Auto gelb, 3. Auto rot, 4. Fußgänger grün, 5. Fußgänger Rot, 6. Auto Rotgelb, 1. Auto grün
Dann setz das mal für eine Kreuzung um...
So lernst du Programmieren. Wenn du dann eine eigene Aufgabe hast, weißt du auch, was zuerst zu tun ist. Richtig, alles bis ins kleinste zerlegen, analysieren und in Schritte verpacken. Dann brauchst du nur noch die Befehle aus BASCOM heraussuchen um die Schritte zu bearbeiten.
Ich hoffe, es hilft dir ein wenig. Ach so ja, Willkommen im Club
Gruß oldmax
 
Hi
Ach so, ich les grad, du hast es noch gar nicht auf dem Controller.Also, du hast das Programm in BASCOM geschrieben. Welcher Controller? Ist das Programm fehlerfrei übersetzt, Hast du Verbindung zum Controller. All diese Fragen solltest du so genau wie möglich beschreiben, denn du sitzt vor der Hardware, wir haben nur deinen Text : "Es geht nicht, Hilfe"
Hast du bei deinem Paket eine Anleitung, nach der du das alles zusammenfrickeln musst? Spannungsversorgung korrekt? Wie du siehst, es gibt da einiges zu erklären, bzw. zu berücksichtigen. So einfach "Schreib mal >flash< gehts nicht.
Gruß oldmax
 
Hi Dino
Könnt ja sein, das er ab und zu mal reinschaut, ohne sich anzumelden. Und wenn nicht, nun, dann hilft es vielleicht eiem anderen.... :ciao:
 
Bascom lernen

Hallo Oldman,
entschuldige bitte das ich mich erst so spät wieder melde. Genau wie Du beschrieben hast habe ich den Weg eingeschlagen. Ich habe mir ein myAVRBoard MK2 und ein myAVRBoard light mit den Programmer zugelegt und auch
Versuche gestartet. Am Anfang hatte ich große Probleme mit dem 'Brennen was ich aber jetzt so einigermaßen
beherrsche. Jetzt bin ich dabei ADC-Werte einzulesen mit 2 gegen einander geschalteten LED's, was auch funktioniert hat. Jetzt wollte ich das Programm wegen der Übersichtlichkeit von Kommentaren und Befehlen befreien. Jetzt stehe ich vor dem Problem, dass es nicht mehr funktioniert. Nun muss ich wieder von vorn anfangen um den Fehler zu finden.
Jetzt werde ich mich bestimmt öfters melden.
MfG Rudolf
 
Hallo Rudolf,

Jetzt bin ich dabei ADC-Werte einzulesen mit 2 gegen einander geschalteten LED's, was auch funktioniert hat. Jetzt wollte ich das Programm wegen der Übersichtlichkeit von Kommentaren und Befehlen befreien. Jetzt stehe ich vor dem Problem, dass es nicht mehr funktioniert. Nun muss ich wieder von vorn anfangen um den Fehler zu finden.

das Problem kann man ganz elegant umgehen wenn man mit verschiedenen Versionen arbeitet. :p

Ich speichere zB nicht immer mit dem selben Namen da man sonst die Probleme haben kann die du zur Zeit hast.

Ich mache das folgendermaßen:
- Bei kleinen Änderungen speichere ich mit dem selben Namen und Versionsnummer.
- bei größeren Änderungen wird unter einer neuen Versionsnummer gespeichert.

zB ...

- Projektname_v0.bas -> das erste Programmgerüst
- Projektname_v1.bas -> erste Version mit den ersten Funktionen
- Projektname_v2.bas -> zweite Version und voll funktionsfähig
- Projektname_v3.bas -> dritte Version (zweite Version die aufgeräumt wurde)

... oder ...

- Projektname_140312.bas -> Version vom 12.03.2014
- Projektname_140423.bas -> Version vom 23.04.2014
- Projektname_140507a.bas -> erste Version vom 07.05.2014
- Projektname_140507b.bas -> zweite Version vom 07.05.2014

Damit kann man dann immer problemlos auf die letzte funktionsfähige Version zurückgehen.
Ich bevorzuge mittlerweile die Versionsnummern im Datumsformat.

Gruß
Dino
 
Mit verschiedenen Versionsnamen speichere ich die Dateien auch ab.

Weiterhin (wenn ich daran denke) schreibe ich in den ersten Zeilen des Programms einen Kommentar, was ich geändert habe. Auch das hat sich bewährt. Sonst fragt man sich am nächsten Tag, was denn der Unterschied zwischen den fünf Versionen war.
 
Hallo,

Weiterhin (wenn ich daran denke) schreibe ich in den ersten Zeilen des Programms einen Kommentar, was ich geändert habe. Auch das hat sich bewährt. Sonst fragt man sich am nächsten Tag, was denn der Unterschied zwischen den fünf Versionen war.

stimmt. Sozusagen "Release Notes" in den Programmkopf mit reinnehmen. Gute Idee :cool:

Kann man aber notfalls noch mit WinMerge zwischen den verschiedenen Versionen vergleichen.

Gruß
Dino
 
Bascom

Hallo,
Danke für die hinweise, hab schon gemerkt wie wichtig die Übersichtlichkeit ist. Zu meinem Beitrag möchte ich jetzt noch folgendes hinzufügen:


Code:
' ADC Einlesen 23.4.2014
      '        ÜBUNG
 ' ADC einlesen über 2 Poti
 ' AVR910, COM5 Baud 19200        am 7.5.14     i.O
$regfile = "m8adef.dat"
$crystal = 36864000
$hwstack = 32
$swstack = 10
$framesize = 40
$baud=19200



config Adc =Single , Prescaler =128  , Reference= AVCC  ' èxt.ref. 1,68V
config portb = output                  'L293D 2x H-Brücke
config  portd.2=output                 'Kontrolle Einschaltschwelle  LED rt
config portd.3=output                  'Kontrolle LED gb
config portd.7=output                 'Kontolllampe gb Schleife nach Do

Const Einschaltschwelle = 400         'Einschaltschwelle Lichtstärke = 1,95V
'const Ausschaltschwelle = 150         'Ausschaltschwelle Lichtstärke = 0,73V



Dim E as word                      'Wert Sensor Ost  "0...1023 =0-5V
Dim W as word                       'Wert Sensor West

Dim EW as word                        'Summe E+W
Dim speed as integer
 speed=1000
 Start ADC
 ' PORTd.7  =1                 'Startbedingung für Kontroll-LED bl  aus



DO
    Portd.7=0
  'portd.2=1
   'If Ist_sekunde <> Letzte_sekunde Then  'Wenn neue Sekunde dann:

      E=Getadc(4)
    '  portd.2=1
      W=Getadc(5)
      'Print"ADC4:" ;E

       portd.2=1        'LED rt

      EW=E+W


       If   Einschaltschwelle >W Then    'es ist ausreichend hell
        portd.3=1          'gb an
        portd.7 =1               '=2,16V
        waitms speed              'Kontroll-LED bl an
        Portd.3=0          'gb aus
         ' If Ist_sekunde <= M_dauer then  'Motor ein

            IF E>W  then
               Set  PORTb.2
                Reset portb.3
             End if

             IF W>E then
                Set  PORTb.3
                Reset portb.2
             End if
      loop           'portb.2 u.-.3 i.O. / aber blau (portd.7) nicht
    '****************************************************************
       END              ' portd.2u.3 brennen dauernd
    '*****************************
       end if
       end


      '   Else                          'wenn Motorlaufzeit abgelaufen

         '   SET portb.2                  ' Motor aus
         '   SET portb.3

        ' END IF

    '  Else

        ' IF  EW < Ausschaltschwelle then
           ' Set  PORTb.1                   'Kontroll-LED aus
           ' set  portb.2              'Motoren Parkposition anfahren
          '  Reset  PORTb.3        'und auf Endschalter stehen bleiben

       '  End IF

    '  End if

     ' If Ist_sekunde = M_intervall then 'zykluszeit abgelaufen?
      '   Ist_sekunde = 0                 'neuer Zyklus beginnt

     ' End if

    '  Letzte_sekunde = Ist_sekunde   'àktualisieren
  ' End  IF

'loop

'End
'Timer_irq:

'Timer1 = Timervorgabe      'wieder voreinstellen
'Incr  IST_SEKUNDE          'Sekundenzähler +1
'Return
Funktion klappt wie in Zeile********** aufgeführt.
nun meine Fragen: Wie ist das mit dem Hochkomma, werden die Kommentare bzw. Befehle übernommen?
Was ist falsch, das LED rt und LED gb nicht ausgehen und LED bl nicht angeht?
Nach Bereinigung (wegen Übersichtlichkeit) ging nichts mehr. Da mir der Beitrag jetzt zu lang ist, werde ich den Code das nächste mal reinstellen.
MfG Rudolf
 
Hallo Rudolf,

du solltest dir angewöhnen den Quelltext entsprechend einzurücken, das erhöht die Übersichtlichkeit und hilft logische Fehler zu vermeiden.
BASCOM reagiert mitunter recht seltsam auf "vergessene" END IF o.ä.

Bsp:
Code:
if x > Y then
  x = 5
  'Kommentar
else
  x = 7
  'x = 9
  'Kommentar
end if

'alles, was hinter dem Hochkomma steht ist Kommentar

'x = 9  'wird also nicht ausgeführt, weil das Hochkomma am Zeilenanfang steht
'Wenn du deinen Quelltext entsprechend einrückst, wird der Code übersichtlicher und du wirst den Fehler sicher selbst finden!

- gp177 -
 
du solltest dir angewöhnen den Quelltext entsprechend einzurücken, das erhöht die Übersichtlichkeit und hilft logische Fehler zu vermeiden.
er hat es versucht aber die Code-Tags waren im Beitrag falsch eingesetzt. Ich habs mal geändert.

[ CODE ] am Anfang und [ / CODE ] am Ende
(natürlich ohne die Leerzeichen zwischen den Klammern des jeweiligen Tags)

Gruß
Dino
 
Hallo,
habe das Programm überarbeitet und habe aber immer noch Problem. Es soll eine Motorsteuerung mit Lichtsensoren werden. Das ADC-Einlesen klappt und auch mit den Ausgangsssignalen. Aber warum leuchten die LED am Portd 2immer u.3 u.5 nicht. Welche Einstellung habe ich noch falsch gemacht?
MfG
Bascomlaie

code ist mit copy

Code:
' ADC Einlesen 16.05.2014  Änderung 290514
      '        ÜBUNG
 ' ADC einlesen über 2 Poti

$regfile = "m8adef.dat"
$crystal = 36864000
$hwstack = 32
$swstack = 10
$framesize = 40
$baud=19200



config Adc =Single , Prescaler =128  , Reference= AVCC
config portb = output                                              '2X LED ws u. rt Portb.3u.4
config portd = output                                              'Kontrolle Einschaltschwelle  LED rt1

Const Einschaltschwelle = 400                                'Einschaltschwelle Lichtstärke = 1,95V
const Ausschaltschwelle = 150                                'Ausschaltschwelle Lichtstärke = 0,73V



Dim E as word                                                     'Wert Sensor Ost  "0...1023 =0-5V
Dim W as word                                                    'Wert Sensor  west
Dim EW as word                                                  'Summe E+W


   Start ADC


        set portb.0                                                 'Startbedingung für Kontroll-LED bl  aus
        reset  PORTB.5
        portd.2=0                                                  'nur zur Kontrolle  > ist an
        portd.3=1                                                  'nur zur Kontrolle  > ist aus
        portd.5=1                                                  'nur zur Kontrolle  > ist aus

DO


         E=Getadc(4)                                            'von Poti 1 = 1,5V

         W=Getadc(5)                                           'von Poti 2 = 0,9V


         EW=E+W

         if EW>Einschaltschwelle then

         reset portb.0                                         ' LED aus
         set  PORTB.5                                         ' LED aus

         end if



         IF E>W  then

            set portb.4                                           'ws ist an /Steckboard
            Reset portb.3                                       'ws ist an /Steckboard
             End if


        IF W>E then


           Set  PORTb.3                                        'rt an /Steckboard
           Reset portb.2                                       'rt an /Steckboard
           End if

      loop           '
    '****************************************************************
      END
    '*****************************
 
Weil Du genau das vor der Hauptschleife einstellst, und innen nichts mehr änderst.
An welchen Ports hast Du denn LEDs, und wie ist welche angeschlossen?

Tip am Rande: Du kannst den Beinchen (Bits, zb PORTD.2) mit alias auch Namen geben, zB LED1, und diesen dann verwenden.
Such in der Hilfe einfach mal nach alias.
 
Meiner Meinung nach musste aber Portd.2=0 aus und Portd.3 u.5=1 an sein und so bleiben, es ist aber gerade umgekehrt. LED hab ich an Portd.2,3 u.5 sowie 1x an portb.o u5(mit set und reset) in der Schleife(bleibt aber aus )angeschlossen. Die 1. 3 LED sind auf myAVRBoard MK2 vorgefertigt.
MFG Bascomlaie
 
Wenn die LEDs von Vcc über nen Vorwiderstand auf das Prozessorbein gehen, paßt das. Ne 1 im Portregister legt das Bein auf Vcc, ne 0 auf Gnd (wenn es Ausgang ist).
Schau mal hier.
 
Hallo,

Mal kurz eine Zwischenbemerkung.
Bei der Crystal Angabe ist doch eine Null zu viel, oder brauch ich ne neue Brille?

Gruß
Gerry
 
Hmm...
Der Mega8 ist mit max 16MHz angegeben, oder? Knapp 37MHz wären arg übertaktet...;)

Nachtrag: in der Schleife manipulierst Du PORTB...

@Dino: danke für die Tags...
 
Danke für eure Hinweise. ich habe das Programm noch mal überarbeitet. So wie auf der Zeichnung habe ich die LED angeschlossen. LED 1+2 funktionieren nur LED bl klappt nicht. Wo kann der Fehler liegen?

Code:
' ADC Einlesen 16.05.2014  Änderung 02062014
      '        ÜBUNG
 ' ADC einlesen über 2 Poti

$regfile = "m8adef.dat"
$crystal = 3686400
$hwstack = 32
$swstack = 10
$framesize = 40
$baud=19200



config Adc =Single , Prescaler =128  , Reference= AVCC
config portb = output                  '2X LED ws u. rt Portb.3u.4
config portd = output                 'Kontrolle Einschaltschwelle  LED rt1

Const Einschaltschwelle = 400         'Einschaltschwelle Lichtstärke = 1,95V
const Ausschaltschwelle = 150         'Ausschaltschwelle Lichtstärke = 0,73V



Dim E as word                      'Wert Sensor Ost  "0...1023 =0-5V
Dim W as word                      'Wert Sensor  west
Dim EW as word                       'Summe E+W


   Start ADC

 Do
        set portb.0            'Kontroll-LED bl aus  LED brennt

        portd.2=0               'nur zur Kontrolle  > ist an
        portd.3=1               'nur zur Kontrolle  > ist aus
        portd.5=1               'nur zur Kontrolle  > ist aus




         E=Getadc(4)                     'von Poti 1 = 1,5V

         W=Getadc(5)                     'von Poti 2 = 0,9V


         EW=E+W

         if EW>Einschaltschwelle then

         reset portb.0                 ' LED bl ist an

         end if



         IF E>W  then

            set portb.4                        'ws ist an /Steckboard
            Reset portb.3                      'ws ist an /Steckboard
             End if


        IF W>E then


           Set  PORTb.3                        'rt an /Steckboard
           Reset portb.4                       'rt an /Steckboard
           End if
         IF W < Ausschaltschwelle then

            set portb.0                       'LED bl bleibt an

            end if

      loop           '
    '****************************************************************
      END
Schaltplan
 

Anhänge

  • img002.jpg
    img002.jpg
    209,6 KB · Aufrufe: 16
Schaltplan? Wo ist die LED denn konkret angeschlossen? Laut Deiner Skizze liegt die Seite wo Vcc drann steht (Anode, Widerstand) auf Bein C0 (welches im Programm tristate bleibt). Die Anode geht auf Bein B2 (welcher mit "PortB=Output" von tristate auf Gnd umgeschaltet wird). Allerdings liegt nach Deiner Skizze auch der obere Anschluß der Doppelled auf dem Anschluß, der Vcc zu sein scheint (unter der Spule die auf AVcc geht).
Irgendwas paßt also nicht...
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)