mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Mittelstellung von Servos + LCD


Autor: Michael Justinger (juston)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
das Programm soll dazu dienen die Mittelstellung von 2 Servos zu finden.

Dabei soll mit Taster 1 der OCR1B Wert für Servo 1 erhöht werden und mit 
Taster2 soll der OCR1B Wert für das 2. Servo erhöht werden.

Es soll nur ein Timer verwendet werden.
Der Wert soll dann auf dem LCD Display ausgegeben werden.

Das Problem ist jedoch das ich garnix auf dem Display sehe außer halt 
den schwarzen Balken.

Bin mir auch nicht sicher ob das Programm ansonsten funktioniert.
#include <avr/io.h>
#include "lcd-routines.h"
#include <stdlib.h>
#include <avr/interrupt.h>
#define  F_CPU 8000000
#include <util/delay.h>


int     Wert1;
int     Wert2;
#define AnzSer 2
#define cycl  20000/ AnzSer
#define min   750
#define max   2100
uint16_t ServoSpeed = (min+max)/2;
uint16_t ServoSpeed2 = (min+max)/3;
uint8_t z;


void init (void)
{
  DDRD   = 0b00000001;        
  PORTD  = 0b11111110;        

  DDRC  = 0b00000001;        


  TCCR1B  = (1<<CS11) | (1<<WGM12);  
  OCR1A  = cycl;            

  TIMSK = (1<<OCIE1A) | (1<< OCIE1B);  

  sei();                

}


ISR(TIMER1_COMPA_vect)
{
  if (z == 1)
  {
   PORTD |= (1<<PD0);  
   OCR1B = ServoSpeed;     
   Wert1 = OCR1B;          
  }


  if (z == 2)
  {
   PORTC |= (1<<PC0);  
   OCR1B = ServoSpeed2;   
   Wert2 = OCR1B;        
  }
}




ISR(TIMER1_COMPB_vect)
{
  PORTD &= ~(1<<PD0);  
  PORTC &= ~(1<<PC0);

  z ++;

  if (z>AnzSer) 
  { 
  z=1;
  }  
}


int main (void)
{
  init();

  while (1)
  {

      if (!(PIND & (1<<PD2)))
    {
    ServoSpeed ++;
    _delay_ms(1);
  
    }


    if (!(PIND & (1<<PD3)))
    {
    ServoSpeed2 ++;
    _delay_ms(1);
    }
    

      set_cursor(0,1);
      lcd_string("Ser.1 = ");

      set_cursor(9,1);


     {
         char Buffer[20]; 
         itoa( Wert1, Buffer, 10 ); 
 
         lcd_string( Buffer );
      }


        set_cursor(0,2);
        lcd_string("Ser.2 = ");

        set_cursor(9,2);


     {
         char Buffer[20]; 
         itoa( Wert2, Buffer, 10 ); 
 
         lcd_string( Buffer );
     } 
      
    }
 
    return 0;
}

PS: Soll ich das Programm das nächste Mal als Anhang machen oder ist das 
so ok?

Autor: E. B. (roquema) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>PS: Soll ich das Programm das nächste Mal als Anhang machen oder ist das
>so ok?
Bei der Länge besser als Anhang.

>Dabei soll mit Taster 1 der OCR1B Wert für Servo 1 erhöht werden und mit
>Taster2 soll der OCR1B Wert für das 2. Servo erhöht werden.

Und womit werden die Werte wieder runtergestellt?

Wo wird das Display denn initialisiert?
lcd_init, oder wie das bei deiner Routine heißt, muss einmalig 
aufgerufen werden.
Den Rest hab ich nicht näher angesehen...

Autor: Michael Justinger (juston)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ja da muss ich wohl zugeben, dass ich ''init() '' mit '' lcd_init()'' 
verwechselt habe weswegen die Display Initialisierung fehlt.

Eine Displayausgabe habe ich jetzt auch. Das Programm scheint auch zu 
funktionieren.

Ich habe nur 3 Taster zur Verfügung und einer ist schon für Reset 
vorbehalten. Von daher bleibt nix anderes übrig als von vorne anzufangen 
wenn man übers Ziel hinaus ist.

Ich habe mir auch schon überlegt wie man das Problem mit dem runter 
zählen lösen könnte aber mir ist noch nix machbares eingefallen.
Für Anregungen von euch wäre ich dankbar.

Gruß
Michael

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.