Hallo

Die Umsetzung von C nach Bascom für Stufe 1 (nur Kamera und AVR) gibt's hier:

https://www.roboternetz.de/phpBB2/ze...=434274#434274

Wesentlich ist die Einstellung des ADC auf gewünschte Funktion: Freeruning mit Prescaler /2 und linksbündiges Ergebniss. Das ist allerdings schon etwas älter. Die neusten Erkenntnisse, die wir erst nach dem Start des Mitmachprojekts gewonnen haben, sind in dieser Umsetzung noch nicht berücksichtigt.

Ich habe bisher "nur" Stufe 1 nachgebaut. Das hatte ich zwar im Prinzip schon immer, neu ist jedoch der Aufbau auf der Experimentierplatine und der jumperbare Widerstand parallel zum Signal.

Gruß

mic

[Edit]
Nebenbei mal bemerkt: Die Hauptschleife der Liniensuche in der Bascom-Umsetzung ist ja echt knuffig:
Code:
Do
' keine Störung erlauben
   Disable Interrupts

' Warten auf Bildstart
   Do
      X = 0
      While Adch > 30                                       ' sichtbare Zeile
      Wend
      While Adch < 50                                       ' Strahlrücklauf
         Incr X
      Wend
   Loop Until X > 40                                        ' sync länger als 40


'warten auf 50ste Zeile
   X = 50
   While X > 0
      While Adch > 30                                       ' sichtbare Zeile
      Wend
      While Adch < 50                                       ' Strahlrücklauf
      Wend
      Decr X
   Wend

' Der Strich ist dunkler als 65. Wir zählen von links die Anzahl der
' Lesungen bis der Strich erkannt wird
   X = 0
   While Adch > 65
     Incr X
   Wend

' Linie gefunden
   Enable Interrupts

' ermittelten Wert in Leerzeichen umrechnen und beides zum Terminal senden
   Print X ;
   S = Space(x)
   Print S;

   Print "***"
   Waitms 200
Loop
Hier sieht mal wieder, wie einfach man auch mit Bascom sehr flotte Anwendungen ohne Assembler programmieren kann ;)

[NocheinEdit]
Jetzt wäre eine Erweiterung auf eine Linienverfolgung nicht schwer, wenn man die Antriebe mit Bascom ansteuern kann. Da ich nicht weiß, ob es schon Bascom-Funktionen für den RP6 gibt, habe ich mal auf meiner Festplatte gesucht und ein undokumentiertes RP6-Programm (vom 21.8.08?) mit Motoransteuerung gefunden:
Code:
$regfile = "M32def.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 32
$framesize = 64
$baud = 38400

Declare Sub Rp6_vorwaerts()
Declare Sub Rp6_rueckwaerts()
Declare Sub Rp6_stop()
Declare Sub Rp6_links()
Declare Sub Rp6_rechts()

Dim Tccr1a_set As Byte
Dim Tccr1b_set As Byte
Dim Wert As Byte
Dim Zaehler As Word
Dim Zaehler1 As Word
Dim Test As Byte

Dim Address As Byte , Command As Byte

Config Rc5 = Pinb.2

Config Pinc.2 = Output
Config Pinc.3 = Output
Config Pinb.4 = Output

On Int0 Int0_int
On Int1 Int1_int
On Int2 Int2_int

Enable Interrupts

Config Int0 = Falling
Config Int1 = Falling

Enable Int0
Enable Int1
Enable Int2

Tccr1a_set = 0
Tccr1b_set = 0

Reset Tccr1a_set .wgm10
Set Tccr1a_set .wgm11
Set Tccr1a_set .com1a1
Set Tccr1a_set .com1b1
Tccr1a = Tccr1a Or Tccr1a_set

Reset Tccr1b_set .wgm12
Set Tccr1b_set .wgm13
Set Tccr1b_set .cs10
Tccr1b = Tccr1b Or Tccr1b_set

Icr1h = 0
Icr1l = 210

Set Portb.4

Wert = 0

Wait 1

Do

Waitms 500


Loop

Reset Portb.4

End

Int0_int:
   Disable Int0
   Enable Interrupts
   Zaehler = Zaehler + 1
   Enable Int0
Return

Int1_int:
   Disable Int1
   Enable Interrupts
   Zaehler1 = Zaehler1 + 1
   Enable Int1
Return

Int2_int:
   Disable Int2
   Enable Interrupts
   Getrc5(address , Command)
   If Command = 1 Then
      Call Rp6_vorwaerts()
   End If
   If Command = 2 Then
      Call Rp6_rueckwaerts()
   End If
   If Command = 3 Then
      Call Rp6_links()
   End If
   If Command = 4 Then
      Call Rp6_rechts()
   End If
   If Command = 0 Then
      Call Rp6_stop()
   End If
   Enable Int2
Return

Sub Rp6_vorwaerts()
      Call Rp6_stop()

      Reset Portc.2
      Reset Portc.3

      For Wert = 0 To 100
         Waitms 20
         Pwm1a = Wert - 3
         Pwm1b = Wert
      Next
End Sub

Sub Rp6_rueckwaerts()
      Call Rp6_stop()

      Set Portc.2
      Set Portc.3

      For Wert = 0 To 100
         Waitms 20
         Pwm1a = Wert - 3
         Pwm1b = Wert
      Next
End Sub

Sub Rp6_links()
      Call Rp6_stop()

      Set Portc.2
      Reset Portc.3

      For Wert = 0 To 60
         Waitms 20
         Pwm1a = Wert
         Pwm1b = Wert
      Next
End Sub

Sub Rp6_rechts()
      Call Rp6_stop()

      Reset Portc.2
      Set Portc.3

      For Wert = 0 To 60
         Waitms 20
         Pwm1a = Wert
         Pwm1b = Wert
      Next
End Sub

Sub Rp6_stop()

    For Test = Wert To 0 Step -1
        Pwm1b = Test
        Pwm1a = Test
        Waitms 10
    Next

    Wert = 0

End Sub
Das Programm kennt folgende Motorfunktionen:

Declare Sub Rp6_vorwaerts()
Declare Sub Rp6_rueckwaerts()
Declare Sub Rp6_stop()
Declare Sub Rp6_links()
Declare Sub Rp6_rechts()

Diese Funktionen kann man mit einer RC5-Fernbedienung auswählen. Woher das Programm stammt und ob es funktioniert kann ich leider nicht sagen.