-         

+ Antworten
Ergebnis 1 bis 3 von 3

Thema: Programme für das Board RN-Control

  1. #1
    Administrator Robotik Einstein Avatar von Frank
    Registriert seit
    30.10.2003
    Beiträge
    4.955
    Blog-Einträge
    1

    Programme für das Board RN-Control

    Anzeige

    Programme zu RN-Control

    Hier möchte ich wieder ein Testprogramm zum Board RN-Control posten. Damit haben es Einsteiger die das Board gerade zusammengebaut oder fertig gekauft haben etwas einfacher die ersten Funktionen zu testen.
    Im Gegensatz zum RNBFRA Board habe ich die Test´s nicht in kleine Teilprogramme aufgeteilt sondern in ein Gesamtprogramm. Das das Board ja über mehrere Taster verfügt, können die einzelnen Test´s (Funktionen) einfach per Taste auf dem Board angewählt werden.

    Das ganze hat auch den Vorteil das man gleich sieht wie man die Tasten am einfachsten abfragen kann. Zudem habe ich absichtlich Unterfunktionen und Subroutinen verwendet. Dadurch wird das ganze etwas übersichtlicher und man kann einzelne Funktionen Schrittweise durch andere ersetzen.

    Wenn jemand weiter Ideen für Beispiele hat, kann er diese gerne posten. Andere Einsteiger werden das sicher begrüßen. Auch eine C- oder ASM-Variante wäre nicht schlecht. Die C-Fan´s im Forum sind leider noch nicht so aktiv beim posten von Beispielen. Schade!

    So, nun zum Beispielprogramm. Das Programm ist für Mega 16 konzipiert aber läuft natürlich auch auf Mega 32. Die Funktion des Programmes ist im Quelltext sicher ausreichend erläutert. Wie man Bascom installiert und Programm compiliert steht ja in der RN-Control Anleitung.

    Code:
    '###################################################
    'rncontroltest.BAS
    'für
    'RoboterNetz Board RN-Control 1.1
    'Das neue preiswerte Controllerboard zum experimentieren
    '
    'Aufgabe:
    ' Dieses testprogramm testet gleich mehrere Eigenschaften auf dem Board
    ' Den verschiedenen Tasten sind bestimmte Funktionen zugeordnet
    ' Taste 1: Zeigt Batteriespannung über RS232 an
    ' Taste 2: Angeschlossene Motoren beschleunigen und abbremsen
    ' Taste 3: Einige male Lauflicht über LED´s anzeigen. Am I2C-Bus
    '          darf in diesem Moment nichts angeschlossen sein
    ' Taste 4: Zeigt analoge Messwerte an allen Port A PIN´s über RS232 an
    ''Taste 5: Zeigt digitalen I/O Zustand von PA0 bis PA5 an
    
    
    ' Ser gut kann man aus dem Demo auch entnehmen wie Sound ausgegeben wird,
    ' wie Tasten abgefragt werden und wie Subroutinen und Funktionen angelegt werden
    
    'Autor: Frank
    'Weitere Beispiele und Beschreibung der Hardware
    'unter http://www.Roboternetz.de oder robotikhardware.de
    '#######################################################
    
    
    Declare Sub Batteriespannung()
    Declare Sub Motortest()
    Declare Sub Lauflicht()
    Declare Sub Showporta()
    Declare Sub Showdigitalporta()
    Declare Function Tastenabfrage() As Byte
    
    
    $regfile = "m16def.dat"
    
    Dim I As Integer
    Dim N As Integer
    dim Ton As Integer
    
    
    $crystal = 16000000                                         'Quarzfrequenz
    $baud = 9600
    
    Config Adc = Single , Prescaler = Auto                      'Für Tastenabfrage und Spannungsmessung
    
    Config Pina.7 = Input                                       'Für Tastenabfrage
    Porta.7 = 1                                                 'Pullup Widerstand ein
    
    
    Const Ref = 5 / 1023                                        'Für Batteriespannungsberechnung
    
    Dim Taste As Byte
    Dim Volt As Single
    
    ' Für Motorentest
    'Ports für linken Motor
    Config Pinc.6 = Output                                      'Linker Motor Kanal 1
    Config Pinc.7 = Output                                      'Linker Motor Kanal 2
    Config Pind.4 = Output                                      'Linker Motor PWM
    'Ports für rechten Motor
    Config Pinb.0 = Output                                      'Rechter Motor Kanal 1
    Config Pinb.1 = Output                                      'Rechter Motor Kanal 2
    Config Pind.5 = Output                                      'Rechter Motor PWM
    Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
    Pwm1a = 0
    Pwm1b = 0
    Tccr1b = Tccr1b Or &H02                                     'Prescaler = 8
    
    
    
    
    
    I = 0
    Sound Portd.7 , 400 , 450                                   'BEEP
    Sound Portd.7 , 400 , 250                                   'BEEP
    Sound Portd.7 , 400 , 450                                   'BEEP
    Print
    Print "**** RN-Control 1.1 *****"
    Print "Das neue Experimentier- und Roboterboard"
    Print
    Do
    
    
    
    
       Taste = Tastenabfrage()
       If Taste <> 0 Then
    
          Select Case Taste
             Case 1
                Call Batteriespannung                           'Taste 1 Zeigt Bateriespannung über RS232 an
             Case 2
                Call Motortest                                  'Taste 2 Motoren beschleunigen und abbremsen
             Case 3
                Call Lauflicht                                  'Einige male Lauflicht über LED´s anzeigen. Am I2C-Port darf in diesem Moment nichts angeschlossen sein
             Case 4
                Call Showporta                                  'Zeigt Messwerte an allen Port A PIN´s
             Case 5
                Call Showdigitalporta                           'Zeigt digitalen I/O Zustand von PA0 bis PA5 an
    
    
    
          End Select
          Sound Portd.7 , 400 , 500                             'BEEP
       End If
    
       Waitms 100
    Loop
    
    End
    
    
    
    
    'Diese Unterfunktion fragt die Tastatur am analogen Port ab
    Function Tastenabfrage() As Byte
    Local Ws As Word
    
       Tastenabfrage = 0
       Ton = 600
       Start Adc
       Ws = Getadc(7)
       If Ws < 1010 Then
          Select Case Ws
             Case 410 To 450
                Tastenabfrage = 1
                Ton = 550
             Case 340 To 380
                Tastenabfrage = 2
                Ton = 500
             Case 265 To 305
                Tastenabfrage = 3
                Ton = 450
             Case 180 To 220
                Tastenabfrage = 4
                Ton = 400
             Case 100 To 130
                Tastenabfrage = 5
                Ton = 350
          End Select
          Sound Portd.7 , 400 , Ton                             'BEEP
       End If
    
    End Function
    
    
    
    'Diese Unterfunktion zeigt Bateriespannung an
    Sub Batteriespannung()
    Local W As Word
       Start Adc
       W = Getadc(6)
       Volt = W * Ref
       Volt = Volt * 5.2941
       Print "Die aktuelle Spannung beträgt: " ; Volt ; " Volt"
    
    End Sub
    
    
    'Testet Motoren und Geschwindigkeitsreglung
    Sub Motortest()
       'Linker Motor ein
       Portc.6 = 1                                              'bestimmt Richtung
       Portc.7 = 0                                              'bestimmt Richtung
       Portd.4 = 1                                              'Linker Motor EIN
    
       'Rechter Motor ein
       Portb.0 = 1                                              'bestimmt Richtung rechter Motor
       Portb.1 = 0                                              'bestimmt Richtung rechter Motor
       Portd.5 = 1                                              'rechter Motor EIN
    
    
       I = 0
       Do
          Pwm1a = I
          Pwm1b = I
          Waitms 40
          I = I + 5
       Loop Until I > 1023
    
       Wait 1
       Do
          Pwm1a = I
          Pwm1b = I
          Waitms 40
          I = I - 5
       Loop Until I < 1
       Pwm1a = 0                                                'Linker Motor aus
       Pwm1b = 0                                                'rechter Motor aus
    End Sub
    
    
    'Einige male Lauflicht über LED´s anzeigen. Am I2C-Port darf in diesem Moment nichts angeschlossen sein
    Sub Lauflicht()
    
       Config Portc = Output
       Portd = 0
       For N = 1 To 10
          For I = 0 To 7
             Portc.i = 0
             Waitms 100
             Portc.i = 1
          Next I
       Next N
       Config Portc = Input
    End Sub
    
    
    'Zeigt Die Analogen Messwerte An Port A An
    Sub Showporta()
    Local Ws As Word
    
       Config Porta = Input
       For I = 0 To 5                                           ' Alle internen Pullup Widerständ ein,bis auf Batteriespannungsmessungsport
          Porta.i = 1
       Next I
    
       Print
       Print "Ermittelte Messwerte an Port A:"
       For I = 0 To 7                                           ' Alle Eingäne inkl.messen
          Start Adc
          Ws = Getadc(i)
          Volt = Ws * Ref
          Print "Pin " ; I ; " ADC-Wert= " ; Ws ; " bei 5V REF waeren das " ; Volt ; " Volt"
       Next I
    End Sub
    
    
    'Zeigt den Zustand einiger freier I/OI/O von Die Analogen Messwerte An Port A An
    Sub Showdigitalporta()
    Local Zustand As String
       Config Porta = Input
       For I = 0 To 5                                           ' Alle internen Pullup Widerständ ein,bis auf Batteriespannungsmessungsport
          Porta.i = 1
       Next I
    
       Print
       Print "Ermittelter I/O Zustand Port A:"
       For I = 0 To 5                                           ' Alle Eingäne inkl.messen
          If Pina.i = 1 Then
             Zustand = "High"
          Else
             Zustand = "Low"
          End If
          Print "Pin " ; I ; " I/O Zustand= " ; Pina.i ; " " ; Zustand
       Next I
    End Sub
    Wer dan RNBFRA Board kennt, wird viele ähnlichkeiten erkennen. Das liegt daran das wichtige Ports wie die für die Motorsteuerung, ganz genauso wie beim RNBFRA Board belegt sind. Dadurch können Programme sehr schnell auch etwas verändert und dann auf beiden Boards benutzt werden.
    Übrigens der Piepser (Minilautsprecher) ist ne feine Sache, ich kann jedem nur empfehlen sowas bei seinen Experimentierschaltungen zu berücksichtigen. Es ist kaum zu glauben, aber so ein paar Piepstöne machen das Experimentieren viel angenehmer. Zudem können über die Tonhöhe wichtige Debug-Signale ausgegeben werden wenn man mal einen Fehler in einem Programm sucht.

    Gruß Frank


    Ein weiteres Programm, falls man einen LM75 Temperatursensor anschließen möchte:

    Code:
    '################################################### 
    ' rncontrol_lm75.BAS 
    'für 
    'RoboterNetz Board RN-Control ab Version 1.1 
    'Das neue preiswerte Controllerboard zum experimentieren 
    ' 
    'Aufgabe: 
    ' Temperatur messen mit IC LM75 über den I2C Bus 
    ' Das Beispiel zeigt wie einfach es ist in Basic 
    ' mit RN-Control die Temperatur zu messen 
    ' Benötigt wird nur das IC LM75 
    ' Das IC wird am I2C-Bus angeschlossen und belegt keinen Port 
    
    'Autor: Frank 
    'Weitere Beispiele und Beschreibung der Hardware 
    'unter http://www.Roboternetz.de oder robotikhardware.de 
    'Eigene Programmbeispiele sind im Roboternetz gerne willkommen! 
    '############################################################## 
    
    
    Declare Sub Showtemperatur() 
    
    
    $regfile = "m16def.dat" 
    
    
    Const Lm75slavewrite = &H90 
    Const Lm75slaveread = &H91 
    Dim Lm75high As Byte 
    Dim Lm75low As Byte 
    Dim Temperatur As Integer 
    Dim Nachkommastelle As String * 2 
    
    $crystal = 16000000                                         'Quarzfrequenz 
    $baud = 9600 
    
         I2cinit 
    Start: 
         Showtemperatur 
         Wait 2 
         Goto Start 
    
    
     Sub Showtemperatur() 
       I2cstart 
       I2cwbyte Lm75slaveread 
       I2crbyte Lm75high , Ack 
       I2crbyte Lm75low , Nack 
       I2cstop 
    
       If Lm75high > 127 Then 
          Temperatur = Lm75high And 127 
          Temperatur = Not Temperatur 
          Incr  Temperatur 
       Else 
          Temperatur = Lm75high 
       End If 
    
       Lm75low = Lm75low And 128 
       If Lm75low > 0 Then 
           Nachkommastelle = ",5" 
       Else 
          Nachkommastelle = "" 
       End If 
    
       Print "Die Temperatur beträgt: " ; Temperatur ; Nachkommastelle ; " Grad" 
    End Sub

  2. #2
    Administrator Robotik Einstein Avatar von Frank
    Registriert seit
    30.10.2003
    Beiträge
    4.955
    Blog-Einträge
    1
    Hi
    Ich hab noch ein kleines aber recht hilfreiches Programm für die AVR Programmierer geschrieben.
    Es handelt sich um ein Tool was die umständlich Berechnung der AVR Timer´s abnimmt. Möchte man Beispielsweise in genau definierten Abständen einen Interrupt auslösen, dann gibt man genau diesen Wert vor, wählt die Quarzfrequenz und schon berechnet das Programm die günstigsten Einstellungen und generiert sogar Bascom-Programmcode für die rn-control.
    Der Code kann direkt rüber kopiert und compiliert werden. Kommentare erleichtern dem Einsteiger den Durchblick oder Ausbau.

    Eigentlich ist es also nicht direkt für die rn-control, da es auf dem PC installiert wird (es läuft ab Windows 98 auf allen Windows Rechnern, natürlich auch xp). Aber da der generierte Code an RN-Control angepaßt ist, hab ich es hier mal genannt. Es läßt sich natürlich auch für andere avr-Schaltungen nutzen.


    Download hier:
    http://www.roboternetz.de/phpBB2/dlo...le&file_id=169

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.11.2003
    Beiträge
    991
    hier mal ein kleines Beispiel in C:

    Code:
    #include <avr/io.h>
    
    #define SYSCLK	14756000
    
    void init(void);
    unsigned char get_key(void);
    void delay(unsigned int ms);
    
    /*
     * Hauptprogramm
     */
    int main(void)
    {
    	unsigned char i;
    	
    	init();
    	
    	while(1)
    	{
    		/* Ergebnis auslesen und anzeigen */
    		i = get_key();
    		
    		if (i != 0xff)
    			PORTC = ~(1<<i) & 0x7f;
    		else
    			PORTC = 0x7f;
    	}
    	
    	return 0;	
    }
    
    /*
     * Initialisierung des µC
     */
    void init(void)
    {
    	DDRA = 0x00;		/* Port als Eingang deklarieren ( A/D-Wandler Eingänge ) */
    	PORTA = 0x80;
    	
    	DDRB = 0xff;		/* Port als Ausgang deklarieren */
    	PORTB = 0x00;
    	
    	DDRC = 0xff;		/* Port als Ausgang deklarieren */
    	PORTC = 0x00;
    	
    	DDRD = 0xff;		/* Port als Ausgang deklarieren */
    	PORTD = 0x00;
    	
    	/* Analog zu Digital Wandler aktivieren ( Prescaler = 128, interne +5V Referenz, "8-Bit" Ergebnis ) */
    	ADMUX = (1<<REFS0)|(1<<ADLAR);
    	SFIOR &= ~(1<<ADHSM);
    	ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
    }
    
    /**
     * Fragt die Tasten an AD-Port 7 ab, kann nicht erkennen ob zwei Tasten gleichzeitig gedrückt werden
     *
     *	255  keine Taste gedrückt 
    	0    Taste 1 gedrückt 
    	1    Taste 2 gedrückt 
    	2    Taste 3 gedrückt 
    	3    Taste 4 gedrückt 
    	4    Taste 5 gedrückt 
     */
    unsigned char get_key(void)
    {
    	unsigned char i, taste = 0xff;
    	
    	/* ADC7 mit Vcc als Referenzspannung */
    	ADMUX = (1<<REFS0)|(1<<ADLAR)|0x07;
    	
    	/* AD Wandler starten */
    	ADCSRA |= (1<<ADSC);
    	
    	/* Warten bis das Ergebniss zur Verfügung steht */
    	while(!(ADCSRA & (1<<ADIF)));
    	
    	/* Ergebnis auslesen und anzeigen */
    	i = ADCH;
    	
    	if (i < 36)
    		taste = 4;
    	else if (i < 57)
    		taste = 3;
    	else if (i < 76)
    		taste = 2;
    	else if (i < 94)
    		taste = 1;
    	else if (i < 150)
    		taste = 0;
    	
    	return taste;
    }
    
    /** 
     * Eine kleine Warteschleife
     *
     * ms ist die Anzahl der Millisekunden die "gewartet" werden soll
     */
    void delay(unsigned int ms)
    {
    	unsigned int zaehler;
    	
    	while (ms) 
    	{
    		zaehler = SYSCLK / 5000;
    		while (zaehler) 
    		{
    			asm volatile ("nop");
    			zaehler--;
    		}
    		ms--;
    	}
    }
    Es fragt lediglich die Tasten ab und gibt deren Zustand mit den LEDs aus...

    MfG Kjion

+ Antworten

Berechtigungen

  • Neue Themen erstellen: Ja
  • Themen beantworten: Ja
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •