Atmega 8 + Pc814 wykrywanie napięcia


Jak zaprogramować atmegę 8 do wykrywania napięcia 400 V AC za pomocą trzech PC814. Podłączyłem do portów PC5-3 i sprawdzam czy pojawiła się jedynka czy 0. Niestety jak wiadomo 0 pojawia się dosyć często. Jak zrobić aby atmega sprawdzała czy zanik napięcia jest dłuższy niż 30 sekund to wtedy ma wyłączyć urządzenie.




Portret użytkownika EDC

Odp. Atmega8 + Pc814

Możesz zrobić tak: Na starcie programu zmienna ma wartość 30 i co sekundę jedna jest odejmowana. W pętli napisz że jeśli jest napięcie to wartosc od której odejmujesz ma znów wartość 30. Będzie więc stale miała wartośc 30 chyba że nie będzie pradu to warunek nie uzupełni zmiennej. Wtedy gdy wartosc zmiennej rowna zero wyłącz urządzenie. Cos w ten deseń

Config Timer = Co 1s
On Timer Timer_isr
 
 
Dim Sekundy As Byte
Const Odliczaj = 30
Sekundy = Odliczaj
 
Do
 
If Napiecie = 1 Then
   Sekundy = Odliczaj
End If
 
If Sekundy = 0 Then Urzadzenie Off
 
Loop
End
 
Timer_isr:
If Sekundy > 0 Then Decr Sekundy
Return

-

BARTek
Moja strona

Portret użytkownika krzykrol

Napisałem taki program ale w

Napisałem taki program ale w symulacji nie odmierza timer0

$sim
$regfile = "m8def.dat"
$crystal = 8000000
Config Portb.0 = Output
Config Portd.7 = Output
Config Portd.6 = Output
Config Portb.1 = Output
Config Portb.2 = Output
Config Portb.3 = Output
 
Config Portd.0 = Output
Config Portd.1 = Output
Config Portd.2 = Output
'Config Portb.4 = Input
 
 
Config Adc = Single , Prescaler = Auto , Reference = Avcc   'konfiguracja wewnętrznego przetwornika A/C
 
Config Timer0 = Timer , Prescale = 256
On Timer0 Timer_isr
 
 
Dim Sekundy As Byte
Const Odliczaj = 30
Sekundy = Odliczaj
 
' konfiguracja ledów
'czerwone
Portb.1 = 1
Portb.2 = 1
Portb.3 = 1
'zielone
Portb.0 = 1
Portd.7 = 1
Portd.6 = 1
' konfiguracja sterowania
Portd.0 = 0
Portd.1 = 0
Portd.2 = 0
 
' wyjście na czujnik ciśnienia
Portb.4 = 0
 
 Dim D As Byte
 
Dim Wart_ac1 As Word                                        'zmienna na wartość odczytaną z przetwornika
Dim Wart_ac2 As Word
Dim Wart_ac3 As Word
 
 
Dim V1 As Single                                            'zmienna przechowująca obliczon
Dim V2 As Single                                            'wartość zmierzonego napięcia
Dim V3 As Single
 
 
   Start Adc
 
 Do
 
 
 
 
 
Wart_ac1 = Getadc(5)                                        'odczytanie wartości z wejści ADC0 mikrokontrolera
V1 = Wart_ac1 * 0.0049                                      'zamiana odczytanej wartości z A/C na napięcie
                                               'Wart_ac * ok. 4,8 mV
 
                                                               'V do do formatu x.xx i zamiana
                                                      'tej wartości na postać tekstu
Wart_ac2 = Getadc(4)
V2 = Wart_ac2 * 0.0049
 
 
Wart_ac3 = Getadc(3)
V3 = Wart_ac3 * 0.0049
 
If V1 = 0 And V2 = 0 And V3 = 3 Then
Sekundy = Odliczaj
 
End If
 
If Sekundy = 0 Then
Gosub Wylaczenie
Else
Gosub Zalaczenie
End If
 
 
 
 
 Loop
End
 
 
 Timer_isr:
 
  Timer0 = 6
  incr D
if D=250 then
  D=0
 
 
 If Sekundy > 0 Then Decr Sekundy
 End If
 
 
Return
 
 
 
Zalaczenie:
 
  ' podłączenie ciśnieniomierza
   'If portb.4 = 1 Then
 
' załączenie napięcia
Portd.0 = 1
Portd.1 = 1
Portd.2 = 1
' sygnalizacja zielonymi ledami
Portb.0 = 0
Portd.7 = 0
Portd.6 = 0
 
'sygnalizacja czerwone   wyłącz
Portb.1 = 1
Portb.2 = 1
Portb.3 = 1
 
 
 
 Return
 
Wylaczenie:
' wyłączenie napięcia
Portd.0 = 0
Portd.1 = 0
Portd.2 = 0
'sygnalizacja czerwone
Portb.1 = 0
Portb.2 = 0
Portb.3 = 0
' sygnalizacja zielonymi ledami wyłącz
Portb.0 = 1
Portd.7 = 1
Portd.6 = 1
 
Return

Portret użytkownika matrix

Re: Napisałem taki program...

A gdzie dyrektywy

Enable Timer0
Enable Interrupts

??

W symulacji programowej trzeba też zaznaczyć odpowiednie ptaszki SYMULUJ TIMERY

Portret użytkownika EDC

Odp.Napisałem taki program

Tak jak kolega napisał. Trzeba zezwolić na przerwanie od Timera i zezwolić na przerwanie w ogóle.

Jeszcze chyba zamiast tego
If V1 = 0 And V2 = 0 And V3 = 3 Then
lepiej byś napisał
If V1 < 3 And V2 < 3 And V3 > 3 Then
..bo rozumiem że masz do testów jedną faze, ale nie możesz celować w jedna wartość 3 tylko albo wyżej albo niżej bo równe 3 będzie tam rzadko.

-

BARTek
Moja strona

Portret użytkownika krzykrol

oki dzięki narazie na jednej

oki dzięki narazie na jednej fazie hula niedługo podłącze pod 3 fazy i zobaczę co będzie się działo

Portret użytkownika EDC

Dwa LED`y na jednym pinie

Wiesz kolego, jak tak na to patrze to musiałem sprawdzić coś, co już dawno wpadło mi do głowy, ale nie było nigdy czasu. Można tak podłączyć LED`y by świeciła albo czerwona albo zielona w zależności od stanu portu i to wykorzystując tylko jeden pin. Sprawdziłem i działa. Dla procesora z większą ilością wyprowadzeń może to nie ma takiego znaczenia, ale dla ośmiopinowego Tiny13 robi różnicę :D Tak samo dla sześciu pinów wystarczą trzy... sens ich rozdzielenia jest tylko wtedy gdy mają kiedyś zgasnąć (ewentualnie migać)

... a Twój program mógłby wyglądać tak i pokazywać której fazy nie ma..

$regfile = "m8def.dat"
$crystal = 8000000
' nieskonfigurowane porty i tak sa wejsciami
Config Portb = &B00001111 : Portb = &B11111111
Config Portd = &B11000111 : Portd = &B11111000
 
Config Adc = Single , Prescaler = Auto , Reference = Avcc   'konfiguracja wewnętrznego przetwornika A/C
 
Config Timer2 = Timer , Prescale = 256 , Compare = Disconnect , Clear Timer = 1       'timer laduje sie sam
Enable COMPARE2 : On COMPARE2 Timer2_isr : COMPARE2 = 124
 
Dim D As Byte , Sekundy As Byte , N As Byte , Help As Byte , Flaga As Bit , Ustaw As Bit
Dim Wart_ac(3) As Word                                      'tylko wartosc do 1024 bo nie wyswietlamy wyniku
 
Const Odliczaj = 30                                         'stala na poczatku listingu by pozniej latwiej edytowac
Sekundy = Odliczaj
 
Start Adc
Enable Interrupts
'*** START ***
 Do
'co 1s
If D = 250 Then
    D = 0
     If Sekundy > 0 Then Decr Sekundy                       'odejmuj sekundy(jesli sa by nie bylo 255)
 
Flaga = 1                                                   'flaga do testowania (kazdy blad ja zeruje)
For N = 1 To 3                                              'dla trzech przypadkow
 Help = N + 2                                               'pomocnicza zmienna by numer ADC sie zgadzał
  Wart_ac(n) = Getadc(help)                                 'Wart_ac od 1 do 3  z ADC  od 3 do 5
  If Wart_ac(n) < 600 Then                                  'wartosc 5V to 1024 wiec polowa 2,5V to 500..
   Flaga = 0                                                'jesli mniej to zgas flage
   Portb.n = 1                                              'i pokaz ktorej fazy nie ma
  Else
   Portb.n = 0                                              'jesli jest faza inny kolor
  End If
Next
                                                            'jesli sa wszystkie fazy
If Flaga = 1 Then                                           'odswiez zmienna
 Sekundy = Odliczaj                                         'porty ustaw na wlaczone
 Ustaw = 1
End If
                                                             'jesli nie to porty wylacz
If Sekundy = 0 Then Ustaw = 0
 
For N = 0 To 3                                              'ustawianie portow wartoscia
 Portd.n = Ustaw
Next
 
End If                                                      'koniec warunku "co sekunde"
 
Loop
End
 '*** KONIEC ***
 
Timer2_isr:
  Incr D
Return

Na koniec dodam że Twoje obliczenia dla Timera chyba nie bardzo działały bo wyglądają jak dla preskalera 128 który chyba nie jest tam osiągalny...a 6 napewno nie da sekundy dla preskalera 256.

Miłego dnia

-

BARTek
Moja strona