Sari la conținut
ELFORUM - Forumul electronistilor

16F876 - Prea multe instructiuni?


Postări Recomandate

O mica problema.....

PIC16F876A, HS 4MHz.

Un ampermetru de dc si ac cu calculul puterii care se comporta bine la masuratori si afisare.

Problema este ca avand tot portul "C" liber, am pus niste leduri care sa se aprinda din 500 in 500W.

Partea de AC masoara curentul pe reteaua de 220v (ac) si face un calcul de putere (momentan nu masor inca tensiunea. este introdusa o valoare in formula puterii).

Ce nu este in regula?

Primele 3 led-uri functioneaza, daca adaug functie pentru inca unul, programul intra in bucla de la "Main" dupa ce parcurge o secventa (while).

Ce nu este in regula?

 

 //Wiring LCDsbit LCD_RS at RB2_bit;sbit LCD_EN at RB3_bit;sbit LCD_D4 at RB4_bit;sbit LCD_D5 at RB5_bit;sbit LCD_D6 at RB6_bit;sbit LCD_D7 at RB7_bit;sbit LCD_RS_Direction at TRISB2_bit;sbit LCD_EN_Direction at TRISB3_bit;sbit LCD_D4_Direction at TRISB4_bit;sbit LCD_D5_Direction at TRISB5_bit;sbit LCD_D6_Direction at TRISB6_bit;sbit LCD_D7_Direction at TRISB7_bit;unsigned char ch, ADCx;unsigned int DCC, ACC;unsigned long ACVal, DCVal, ACPwr, DCPwr;//--------------------------------------------------void main() {  ADCON1 = 0x80;  TRISA  = 0x03;  TRISB = 0;  PORTB = 0;  TRISC = 0;  PORTC = 0;  Delay_ms(50);  Lcd_Init();  Lcd_Cmd(_LCD_CURSOR_OFF);  Lcd_Cmd(_LCD_CLEAR);  Delay_ms(50);  LCD_Out(1,1,"txt logo 1");  LCD_Out(2,1,"txt logo 2");  Delay_ms(3000);  Lcd_Cmd(_LCD_CLEAR);  LCD_Out(1, 1,"DC ");  LCD_Out(2, 1,"AC ");  LCD_Out(1, 9,"A =");  LCD_Out(2, 9,"A =");  LCD_Out(1, 16,"W");  LCD_Out(2, 16,"W");  Delay_ms(50); //------------------------------------------------ do {   DCC = 0;   ACC = 0;   for (ADCx=0; ADCx<10; ADCx++) {DCC += ADC_Read(0); ACC += ADC_Read(1);}   //I0   DCC = DCC/ADCx;   DCVal = (long)DCC*9999;   DCVal = DCVal/1023;   Delay_ms(1);   //I1   ACC = ACC/ADCx;   ACVal = (long)ACC*2200;   ACVal = ACVal/1023;   Delay_ms(1);   //display Value DCPwr   ch = DCVal/1000;   if (ch==0) {LCD_Chr(1,4, 32);}   else {LCD_Chr(1,4,48+ch);}   ch = (DCVal/100) %10;   Lcd_Chr_CP(48+ch);   Lcd_Chr_CP('.');   ch = (DCVal/10) %10;   Lcd_Chr_CP(48+ch);   ch = (DCVal/1) %10;   Lcd_Chr_CP(48+ch);   Delay_ms(5);   //display Value ACPwr   ch = ACVal/1000;   if (ch==0) {LCD_Chr(2,4, 32);}   else {LCD_Chr(2,4,48+ch);}   ch = (ACVal/100) %10;   Lcd_Chr_CP(48+ch);   Lcd_Chr_CP('.');   ch = (ACVal/10) %10;   Lcd_Chr_CP(48+ch);   ch = (ACVal/1) %10;   Lcd_Chr_CP(48+ch);   Delay_ms(5);   //display Power DCPwr   DCPwr = 50*DCVal/100;   ch = DCPwr/1000;   if (ch==0) {LCD_Chr(1,12, 32);}   else {LCD_Chr(1,12,48+ch);}   ch = (DCPwr/100) %10;   Lcd_Chr_CP(48+ch);   ch = (DCPwr/10) %10;   Lcd_Chr_CP(48+ch);   ch = (DCPwr/1) %10;   Lcd_Chr_CP(48+ch);   Delay_ms(5);   //display Power ACPwr   ACPwr = 225*ACVal/100;   ch = ACPwr/1000;   if (ch==0) {LCD_Chr(2,12, 32);}   else {LCD_Chr(2,12,48+ch);}   ch = (ACPwr/100) %10;   Lcd_Chr_CP(48+ch);   ch = (ACPwr/10) %10;   Lcd_Chr_CP(48+ch);   ch = (ACPwr/1) %10;   Lcd_Chr_CP(48+ch);   Delay_ms(5); //-------------------------------------------------   if (ACPwr>=499) {PORTC.F7 = 1;}   else { PORTC.F7 = 0;}   Delay_ms(1);   if (ACPwr>=999) {PORTC.F6 = 1;}   else { PORTC.F6 = 0;}   Delay_ms(1);   if (ACPwr>=1499) {PORTC.F5 = 1;}   else { PORTC.F5 = 0;}   Delay_ms(1);   //if (ACPwr>=1999) {PORTC.F4 = 1;}   //else { PORTC.F4 = 0;}   //Delay_ms(1);   //if (ACPwr>=2499) {PORTC.F3 = 1;}   //else { PORTC.F3 = 0;}   //Delay_ms(1);   //if (ACPwr>=2999) {PORTC.F2 = 1;}   //else { PORTC.F2 = 0;}   //Delay_ms(1);   }   while (1) ;} 

Link spre comentariu
  • Răspunsuri 6
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Zile populare

Top autori în acest subiect

Pare a fi o problema de SRAM.  Sau cum spune Liviu.

 

LE: L-am compilat acum cu mikroC Pic demo si a rezultat un hex cu: Used ROM (program words): 1979 (24%)  Free ROM (program words): 6213 (76%) 

Used RAM (bytes): 73 (21%)  Free RAM (bytes): 279 (79%)

 

mikroe.com spune ca limita este la: 2K of program words . Pare aproape de limita de 2048 words dar nu am primit mesaj de "demo limit".

 

LLE: Ooops. L-am compilat cu partea problematica comentata.

 

Dupa decomentare si compilare la tot codul a rezultat:

Used RAM (bytes): 73 (21%)  Free RAM (bytes): 279 (79%)

Used ROM (program words): 2063 (25%)  Free ROM (program words): 6129 (75%)

 

Tot nu am primit eroare de "demo limit" desi in mod evident am depasit limita.

Clar, Liviu are dreptate. Limita compilatorului in varianta demo a fost depasita.

Editat de mars01
Link spre comentariu

Asa este....

Este varianta demo, MikroC. (acum am observat)

Am vazut si eu statisticile si fiind ~25% nu am crezut ca este o problema pentru ca nu da nici un mesaj de limita ROM.

Multumesc pentru ajutor.

 

L.E. Interesant este ca si in cazul cu PIC16F1847 si 16F88 am avut aceeasi problema :)

Editat de bratueduard
Link spre comentariu

la mai putin de 500W se aprind 7 bucati (fara RC1)

Peste 500, cate unul ori 3. Dar nu in ordinea iesirilor.

 

@thunderer

 

Super tare!

Am scos logo si delay de 3sec + delay de 1ms de la fiecare led.

Am bagat 10 leduri si merge. (2011 program words in ROM) tot sub 2048

Multumesc inca o data. (trebuie sa gasesc o varianta full de mikroc)

 

asa arata partea cu problema acum si functioneaza:

 

if (ACPwr>=499) {PORTC.F7 = 1;}   else { PORTC.F7 = 0;}   if (ACPwr>=999) {PORTC.F6 = 1;}   else { PORTC.F6 = 0;}   if (ACPwr>=1499) {PORTC.F5 = 1;}   else { PORTC.F5 = 0;}   if (ACPwr>=1999) {PORTC.F4 = 1;}   else { PORTC.F4 = 0;}   if (ACPwr>=2499) {PORTC.F3 = 1;}   else { PORTC.F3 = 0;}   if (ACPwr>=2999) {PORTC.F2 = 1;}   else { PORTC.F2 = 0;}   if (ACPwr>=3499) {PORTC.F1 = 1;}   else { PORTC.F1 = 0;}   if (ACPwr>=3999) {PORTC.F0 = 1;}   else { PORTC.F0 = 0;}   if (ACPwr>=4499) {PORTB.F1 = 1;}   else { PORTB.F1 = 0;}   if (ACPwr>=4999) {PORTB.F0 = 1;}   else { PORTB.F0 = 0;}

 

L.E. Am scos si zecimile de la masuratori (oricum nu ar fi contat la 90 de amperi :) ) si acum am deja 1788 program words. 

Editat de bratueduard
Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări