Отговори на тема  [ 8 мнения ] 
MPLAB C18 Delay проблем 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Окт 15, 2006 8:01 pm
Мнения: 46
Мнение MPLAB C18 Delay проблем
Някой дали може да удари едно рамо. Реших да пробвам въпросния компилатор но ударих на камък в началото още. Проблема е следния: опитвам се да замигам един светодиод на пин RA1 на 18F4580

Вместо диода да загасне след определеното закъснение той свети постоянно. Така както е написано в кода който следва диода свети бледо, а ако вместо 10 подам 20 като параметър на Delay100TCYx свети по ярко 8O . Предполагам съм изтървал някоя инициализация но нещо не успявам да открия коя. Хич не мога да си обясня връзката между закъснението и силата на светене :?

Хардуера е вързан правилно, с CCSC нямам проблеми.

Код:
#include <p18f4580.h>
#include <delays.h>

#pragma config OSC = IRCIO67 //Internal oscillator block, port function on RA6 and RA7
#pragma config FCMEN = ON    //Fail-Safe Clock Monitor enabled 
#pragma config IESO = OFF    //Oscillator Switchover mode enabled 
#pragma config PWRT = ON     //PWRT enabled 
#pragma config BOREN = OFF   //Brown-out Reset disabled in hardware and software
#pragma config BORV = 0      //Maximum Setting
#pragma config WDT = OFF     //WDT disabled (control is placed on the SWDTEN bit)
#pragma config WDTPS = 512   //1:512
#pragma config MCLRE = ON    //MCLR pin enabled; RE3 input pin disabled
#pragma config LPT1OSC = ON  //Timer1 configured for low-power operation
#pragma config PBADEN = OFF  //PORTB<4> and PORTB<1:0> Configured as Digital I/O Pins on Reset
#pragma config DEBUG = OFF   //Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins
#pragma config XINST = OFF   //Instruction set extension and Indexed Addressing mode enabled
#pragma config BBSIZ = 1024  //1K words (2K bytes) Boot Block 
#pragma config STVREN = ON   //Stack full/underflow will cause Reset
#pragma config CPD = OFF     //Data EEPROM not code-protected
#pragma config WRTD = OFF    //Data EEPROM not write-protected 
#pragma config CPB = OFF     //Boot block (000000-0007FFh) not code-protected
#pragma config WRTB = OFF    //Boot block (000000-0007FFh) not write-protected
#pragma config EBTRB = OFF   //Boot block (000000-0007FFh) not protected from table reads executed in other blocks
#pragma config CP0 = OFF     //Block 0 (000800-001FFFh) not code-protected
#pragma config CP1 = OFF     //Block 1 (002000-003FFFh) not code-protected 
#pragma config CP2 = OFF     //Block 2 (004000-005FFFh) not code-protected
#pragma config CP3 = OFF     //Block 3 (006000-007FFFh) not code-protected 
#pragma config WRT0 = OFF    //Block 0 (000800-001FFFh) not write-protected
#pragma config WRT1 = OFF    //Block 1 (002000-003FFFh) not write-protected
#pragma config WRT2 = OFF    //Block 2 (004000-005FFFh) not write-protected 
#pragma config WRT3 = OFF    //Block 3 (006000-007FFFh) not write-protected
#pragma config WRTC = OFF    //Configuration registers (300000-3000FFh) not write-protected
#pragma config EBTR0 = OFF   //Block 0 (000800-001FFFh) not protected from table reads executed in other blocks
#pragma config EBTR1 = OFF   //Block 1 (002000-003FFFh) not protected from table reads executed in other bloc
#pragma config EBTR2 = OFF   //Block 2 (004000-005FFFh) not protected from table reads executed in other blocks
#pragma config EBTR3 = OFF   //Block 3 (006000-007FFFh) not protected from table reads executed in other blocks

void delay_ms(unsigned int iCnt)
{
  unsigned int i;
  for(i=0;i<iCnt;i++) Delay1KTCYx(2);
}

void main (void)
{
  OSCCON = 0b01110000;
 
 
 
  /* Reset the LEDs */
  PORTA  = 0b00000000;
  ADCON1 = 0b00001110;
  CMCON  = 0b00000111;
  TRISA  = 0b11111101;
 
  PORTAbits.RA1 = 1;
  Delay100TCYx(10);
  //delay_ms(5);
  PORTAbits.RA1 = 0;
  //delay_ms(500);
}


Сря Дек 13, 2006 11:14 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Мар 22, 2006 3:25 am
Мнения: 6418
Мнение 
промяната в силата на светене говори за две неща
1. мени се коефициента на запълване
2. честотата е доста по висока от колкото очакваш

така като гледам програмата трябва да зададеш закъснение преди и след загасването на светодиода, за да свети половин секунда и след това да не свети още толкова, после трябва да си изчислиш при твоя кварц точно колко ще ти е времето на закъснение, защото и в момента светодиода мига, но прекалено бързо за да го видиш


Сря Дек 13, 2006 11:45 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Пон Фев 21, 2005 2:14 pm
Мнения: 191
Местоположение: Varna
Мнение 
щом един път свети слабо а след това по-силно следва че в крайна сметка мига но прекалено бързо

//ЕДИТ
докато съм писал @nik е отговорил

_________________
Шанс едно на милион, обикновено се случва девет от десет пъти.


Сря Дек 13, 2006 11:52 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Окт 15, 2006 8:01 pm
Мнения: 46
Мнение 
Не, няма мигане. Светенето е постоянно и слабо. Както се вижда от кода няма цикли.
Пробвах и да пиша в LATА вместо PORTA и пак същия резултат.


Сря Дек 13, 2006 11:59 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Пон Фев 21, 2005 2:14 pm
Мнения: 191
Местоположение: Varna
Мнение 
щом свети по-слабо значи мига.

сложи
Код:
for(;;);
накрая на main да видим тогава какво ще се получи

_________________
Шанс едно на милион, обикновено се случва девет от десет пъти.


Чет Дек 14, 2006 12:24 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 24, 2005 11:41 pm
Мнения: 1049
Местоположение: Pz
Мнение 
Пробвай така:
Код:
while   (1)
  {
  PORTAbits.RA1 = 1;
  Delay100TCYx(10);
  //delay_ms(5);
  PORTAbits.RA1 = 0;
  //delay_ms(500);
  }

Освен това, след като свалиш пина в "0", трябва да поставиш още едно закъснение.
А това: delay_ms(500); не е вярно - стойността в скобите не може да е по-голяма от 255 (unsigned char).


Чет Дек 14, 2006 8:26 am
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Окт 15, 2006 8:01 pm
Мнения: 46
Мнение 
Gogo написа:
Пробвай така:
Код:
while   (1)
  {
  PORTAbits.RA1 = 1;
  Delay100TCYx(10);
  //delay_ms(5);
  PORTAbits.RA1 = 0;
  //delay_ms(500);
  }

Освен това, след като свалиш пина в "0", трябва да поставиш още едно закъснение.
А това: delay_ms(500); не е вярно - стойността в скобите не може да е по-голяма от 255 (unsigned char).


Основния проблем не е, че не мига диода а че не мога да го загася след като съм го запалил

LATAbits.LATA1 = 1;
Delay100TCYx(10);
LATAbits.LATA1 = 0;

Това би трябвало да накара диода да светне за съвсем кратко време, обаче той или свети постоянно когато увелича закъснението :? или свети слабо когато намаля или махна нацяло закъснението. Това е след последните ми опити.

Нещо не инициализирам пустия порт като хората и предполагам че някой модул смущава изхода на пин-а.

Съгласен съм че дори като свети силно диода като че ли трепти така че има някакво премигване. Първоначално си мислех че се ресетва и от това е трептенето ама сложих един Sleep на края и е без промяна

Трябва да се чете даташита основно ама все не остава време. Няма ли някой дето тоя проблем да му звучи познато


Чет Дек 14, 2006 11:44 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Яну 30, 2006 2:48 am
Мнения: 1248
Местоположение: София
Мнение 
В разпитване и разговори също се губи време, и не по-малко.....
Така че, по-добре чети!


Чет Дек 14, 2006 11:47 am
Профил WWW
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 8 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 4 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни