logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Konwersja programu sterownika pompy z C++ na C dla AVR Attiny13

Komar91 20 Maj 2012 19:06 3567 12
REKLAMA
  • #1 10917161
    Komar91
    Poziom 18  
    Witam,
    chciał bym zrobić prosty sterownik pompy zał/wył. Ogólna koncepcja jest taka jak pokazuje poniższe zdjęcie.
    Konwersja programu sterownika pompy z C++ na C dla AVR Attiny13
    układ ma załączać pompę gdy poziom wody osiągnie poziom x1 a wyłączyć jak osiągnie poziom x0, następnie pompa ma się załączyć dopiero jak osiągnie znowu poziom x1. Napisałem prosty program w C++ lecz języka C na AVR dopiero się uczę i nie wiem jak to napisać dla mikrokontrolera. Chciał bym aby program najlepiej zmieścił się w Attinie13. Proszę was bardzo o pomoc. Poniżej wstawiam mój kod
    
    // zbiornik.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    
    
    #include <iostream>
    ///////////////////////////////////////////////////
    using namespace std;
    int main();
    
    int main()
    {
    
    bool  x0, x1, y, xp=0;
    cout<<"Opis zmiennych:"<<endl<<"x0 - dolne polozenie wody;"<<endl<<"x1 - gorne polozenie wody;"<<endl<<endl;
    cout<<"Podaj 0 - wylaczone; 1 - zalaczone."<<endl<<endl;
    POCZATEK:
    
    cout<<"Podaj x0: ";
    cin>>x0;
    cout<<"Podaj x1: ";
    cin>>x1;
    
    
            
             if (x0 == 1 && x1 == 1 )
            {
    y = 1;
                    xp=x0;
            }
            else if (x0 == 1 && x1 == 0 && xp == 1)
                 y = 1;
            else if (x0 == 0 && x1 == 0 )
            {
                 y = 0;
                 xp = x0;
            }
            else if (x0 == 1 && x1 == 0 && xp == 0)
                 y = 0;
                    
    
    
    cout<<"Zawor: "<<y<<endl<<endl;
    goto POCZATEK;
        return 0;
    }
    
  • REKLAMA
  • #2 10917297
    Konto nie istnieje
    Konto nie istnieje  
  • #3 10917323
    Komar91
    Poziom 18  
    Tak ten program działa poprawnie i spełnia moje oczekiwania. Gdybym wiedział jak zamienić te funkcje to bym nie pytał. Po prostu ja potrafię zapalić diodę w c dla AVR ale nic poza tym.
  • REKLAMA
  • #4 10917395
    stanleysts
    Poziom 27  
    No to teraz powiedz nam gdzie chcesz wyswietlac te dane?
  • #5 10917531
    Komar91
    Poziom 18  
    Ja nie chcę wyświetlać danych. Założenie jest proste dwa czujniki (switche) x0 i x1 sterują attiny a ta steruję przekaźnikiem do przekaźnika pompa i koniec zabawy.
  • REKLAMA
  • #6 10917615
    tronics
    Poziom 38  
    No to przecież warto by zacząć od przestudiowania dokumentacji techn. procka i dokumentacji libc avr co? Przecież to masz dokładnie to samo co odczyt pozycji klawisza (w tym wypadku odczyt wartości na pinach wejściowych z czujników) i załączenie diody elektroluminescencyjnej (w tym wypadku cewki przekaźnika na pinach wyjściowych).
  • #7 10917637
    tmf
    VIP Zasłużony dla elektroda
    Jeśli potrafisz zapalić diodę to nic więcej nie potrzebujesz. Sterowanie przekaźnikiem jest od strony programu identyczne jak sterowanie diodą. Po prostu twoją zmienną y musisz wyprowadzić na pin, co nie powinno ci przysporzyć kłopotów.
    Zobacz też to: http://mikrokontrolery.blogspot.com/
    Masz tam odpowiedzi na twój problem.
  • #8 10917646
    Konto nie istnieje
    Konto nie istnieje  
  • #9 10917696
    Komar91
    Poziom 18  
    Ojej to był program na PLC który robiłem na zajęciach a chcę aby działał na AVR jak ten kod wkleisz do Microsoft Visual studio to działa bez problemu w konsoli. Ja wiem jak sterować przekaźnik ale mam problem z tymi przyciskami i się męczę i nie wiem co zrobić. Co do wartości BOOL to gdy pojawi się na czujniku woda to zwraca 1 a jak wody nie ma to jest 0 czy to jest niejasne?
  • REKLAMA
  • #10 10917784
    Konto nie istnieje
    Konto nie istnieje  
  • #11 10917953
    Komar91
    Poziom 18  
    A czy byś mógł pokazać chociaż jak zainicjować dwa przyciski w C dla AVR? W zasadzie jest to mój pierwszy program który piszę sam dla AVR i nic w tym nie kumam.
    
    #include<avr/io.h>
    #include <util/delay.h>
    
    
    
    
    
    int main()
    {
    
       DDRC = 10000000;  
      PORTC = 01100000;
       
       while(1)
       {
          if(!(PINC &01000000)) 
    	  PORTC &10000000;
       
       }
    
    
    }
    

    Domyślam się ze dla osób wiedzących o co chodzi jest to proste ale ja nie wiem i macam po ciemku i nic nie mogę zrobić. Panowie zlitujcie się chodź troszkę.

    chcę np aby program zapalał diodę jak przycisk nr1 wciśnięty a jak przycisk nr2 to np pulsująca ale nie wiem jak
  • #12 10917997
    dondu
    Moderator na urlopie...
    Komar91 napisał:
    Panowie zlitujcie się chodź troszkę.

    Najpierw zlituj się sam nad sobą i zacznij korzystać z forum (tysiące kodów w C dot. przycisków) oraz linków, które otrzymujesz. Uściślę więc link, który podał kol. tmf:
    http://mikrokontrolery.blogspot.com/2011/03/drzaskowy-pamietnik-wstep.html
    http://mikrokontrolery.blogspot.com/2011/03/epp-drgania-stykow.html

    Istotna uwaga: Komentuj każdą linię kodu, byśmy wiedzieli co chciałeś nią wykonać - będzie łatwiej szukać nam błędów w Twoim programie.
  • #13 10918223
    Komar91
    Poziom 18  
    Dziękuję za te linki DONDU bardzo pomogły w rozwiązaniu problemu przycisków. Teraz jak będę miał więcej czasu to zabiorę się za resztę programu ogólnie rzecz biorąc teraz jest tak że jak oba przyciski są wciśnięte to dioda świeci a jak puszczę chodź jeden to dioda gaśnie chodź czasami jest tak że program się zawiesza ale to pewnie kwestia drgań styków
    
    #include <avr/io.h>  
    #include <util/delay.h>  
      
    //definicja LED1 (do którego pinu podłączony LED1)  
    #define LED1 PC7  
       
    //definicja KLAWISZ (do którego pinu podłączony KLAWISZ)    
    #define x0 PC6               
    #define x1 PC5  
    void main(void)  
    {  
        //########### I/O ###########  
        DDRC  |= (1<<LED1) ; //Ustawienie pinów sterujących diodami  
                                                   // jako wyjścia  
        PORTC |= (1<<LED1); //Ustawienie stanu wysokiego na wyjściu sterującym LED1   
                                   //(stan początkowy)  
          
        DDRC  &=~ (1<<x0); //Ustawienie pinu klawisza jako wejście   
        PORTC |=  (1<<x0); //włączenie rezystora podciągającego tzw. Pull_up  
        DDRC  &=~ (1<<x1); //Ustawienie pinu klawisza jako wejście   
        PORTC |=  (1<<x1); //włączenie rezystora podciągającego tzw. Pull_up  
        //##########################  
          
       while (1) //Pętla główna  
       {  
          if(!(PINC & (1<<x0)) & !(PINC & (1<<x1)))//jeśli klawisz  wciśniety  
          {  
            PORTC ^=(1<<LED1); 
    	
     
          } 
    		else{ PORTC ^=(0<<LED1); 
    	}  
              
    
        }  
    } 
REKLAMA